c++ - 如何检查类型是否是 C++ 中模板类的类型参数?

标签 c++ templates types typetraits

template<class T>
class A
{};

我需要类似于 std::is_same 的东西或 std::is_base这应该是真实的,例如std::xxxx<double, A<double>>::value (因为 double 是用作模板参数的类型)但对于 std::xxxx<int, A<double>>::value 为 false在编译时。如何做到这一点?

最佳答案

您可以执行以下操作:

#include <type_traits>

template<typename Type, typename Template>
struct is_template_param : std::false_type {};

template<typename Type, template<typename...> class Template, typename... R>
struct is_template_param<Type, Template<Type, R...>> : std::true_type {};

template<typename T>
struct TestStruct1 {};

template<typename T1, typename T2 = float>
struct TestStruct2 {};

static_assert(is_template_param<int, TestStruct1<int>>::value, "");
static_assert(!is_template_param<int, TestStruct2<double>>::value, "");
static_assert(is_template_param<int, std::vector<int>>::value, "");

编辑:

这里是更通用的版本,它允许您检查类型是否是某个模板的第 N 个模板参数:

#include <type_traits>
#include <tuple>

template<std::size_t N, typename Type, typename Template>
struct is_nth_template_param : std::false_type {};

template<std::size_t N, typename Type, template<typename...> class Template, typename... TplParams>
struct is_nth_template_param<N, Type, Template<TplParams...>> : std::is_same<Type, std::tuple_element_t<N, std::tuple<TplParams...>>> {};

// is_template_param from the first version could be replaced with this:
template<typename Type, typename Template>
using is_1st_template_param = is_nth_template_param<0, Type, Template>;

关于c++ - 如何检查类型是否是 C++ 中模板类的类型参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50865095/

相关文章:

c++ - 包含存储在 vector 中的 auto_ptr 的类

c++ - 如何制作像 R f<void(int)>(args...) 这样的模板函数

c++ - 用自己的常量值定义变量的类型

generics - Haskell 中多种类型的列表

c++ - 如何运行 gtest 并确保 sigabrt 永远不会发生

静态成员函数中静态变量的 C++ 作用域

c++ - CMAKE_CXX_COMPILER_VERSION 指向旧的 GCC 版本

c++ - GCC 无法从模板函数中推断出自动返回类型?

c++ - 如何在之前声明的另一个模板参数中使用模板参数

c - 在 c 中硬编码大小的最佳方法