且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

如何静态检查可变参数模板参数列表中是否存在类型T

更新时间:2023-11-30 19:35:28

基于François的答案,这是一个简短的版本,避免使用 std :: tuple ,并使用 std :: integral_constant (通过 true/false_type )并提供C ++ 14样式的 contains_v 别名.总体思路是一样的.

Based on François' answer, here's a shorter version that avoids usage of std::tuple and uses std::integral_constant (via true/false_type) and provides a C++14-style contains_v alias. The general idea is the same though.

template <typename T, typename... Args>
struct contains;

template <typename T>
struct contains<T> : std::false_type {};

template <typename T, typename... Args>
struct contains<T, T, Args...> : std::true_type {};

template <typename T, typename A, typename... Args>
struct contains<T, A, Args...> : contains<T, Args...> {};

template <typename T, typename... Args>
constexpr bool contains_v = contains<T, Args...>::value;

您可以像这样使用它:

static_assert(contains_v<float, float, double>,
    "failure: float not among <float, double>"); // does not trigger

static_assert(contains_v<int, float, double>,
    "failure: int not among <float, double>"); // triggers