这是我的第一次尝试-
#include <iostream>
using namespace std;
enum class props {
left, right
};
template<typename T>
auto allowLeftOnly(T p) -> decltype((p==props::left), void())
{
cout << "Wow!";
}
int main() {
props p1 = props::left;
props p2 = props::right;
allowLeftOnly(p1);
// allowLeftOnly(p2); // should fail to compile
}
我想从 allowLeftOnly
函数中得到的是只接受 props::left
或我明确指定为参数的其他参数,而无法为其他参数编译。这可能吗?
最佳答案
不,这是不可能的。 p1
和 p2
的值是运行时属性,而不是编译时属性,因此编译器在编译时不会“知道”它们的值。
您可以使用 constexpr
让它们在编译时已知,并将它们作为模板参数传递,例如:
#include <iostream>
#include <type_traits>
enum class props {
left, right
};
template <props v>
typename std::enable_if<v == props::left, void>::type allowLeftOnly()
{ std::cout << "Wow!\n"; }
int main() {
constexpr auto p1 = props::left;
constexpr auto p2 = props::right;
allowLeftOnly<p1>();
allowLeftOnly<p2>(); // Fails to compile
}
关于c++ - 将函数参数限制为某些枚举值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44844475/