c++ - 将函数参数限制为某些枚举值

标签 c++ c++11 templates c++14 c++17

这是我的第一次尝试-

#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 或我明确指定为参数的其他参数,而无法为其他参数编译。这可能吗?

最佳答案

不,这是不可能的。 p1p2 的值是运行时属性,而不是编译时属性,因此编译器在编译时不会“知道”它们的值。

您可以使用 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/

相关文章:

c++ - Boost.Asio在该帖子之后被调用处理程序吗?

c++ - numeric_limits 最低和最低成员函数

C++ boost::regex_match 奇怪的行为

c++ - 如何为 lambda 创建唯一类型?

c++ - static_assert 如何用于检查模板函数的迭代器参数的元素类型?

c++ - 将数组分散到仅工作任务

c++ - 有没有一种方法可以将 Qt 中的信号设为 `eat`?

c++ - X 在此函数中使用未初始化

c++ - 总是在 lambda 表达式中捕获所有内容是一种不好的做法吗?

c++ - 带有模板模板参数的 CRTP