c++ - 如何制作可变参数is_same?

标签 c++ templates c++11 variadic-templates

如何创建一个类模板来返回它的任何可变参数类型是否等于第一个类型。我希望能够做到这一点:

is_same<T, A, B, C>::value; // true if T is one of A, B or C

如果 T 等于其中任何一种类型,则其静态 value 成员将为 true,否则为 false。我该怎么做?

最佳答案

C++17 简洁明了:

template <class T, class... Ts>
struct is_any : std::disjunction<std::is_same<T, Ts>...> {};

还有对偶:

template <class T, class... Ts>
struct are_same : std::conjunction<std::is_same<T, Ts>...> {};

使用折叠表达式的变体:

template <class T, class... Ts>
struct is_any : std::bool_constant<(std::is_same_v<T, Ts> || ...)> {};

template <class T, class... Ts>
struct are_same : std::bool_constant<(std::is_same_v<T, Ts> && ...)> {};

关于c++ - 如何制作可变参数is_same?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17032310/

相关文章:

c++ - 由于具有循环引用的类中的 unique_ptr 或 vector 而导致核心转储

c++ - 使模板参数公开的简化方法?

c++ - 类模板的静态成员是否被隐式实例化?

c++ - C++ 中的空传播运算符

c++ - gcc 4.8 或更早版本是否存在关于正则表达式的问题?

c++ - 无法将成员变量设置为对象引用

c++ - 在 Eclipse Mars 中链接 GLFW

c++ - 如何在类声明之外定义嵌套模板类的方法?

c++ - Debian 上的 GLFW 回调 glfwSetDropCallback 有问题

c++ - std::forward 没有完美转发?