簡體   English   中英

如何檢查類型是否是C ++中模板類的類型參數?

[英]How to check if a type is a type parameter for template class in C++?

template<class T>
class A
{};

我需要類似於std::is_samestd::is_base ,例如std::xxxx<double, A<double>>::value (因為double是用作模板參數的類型),但是對於std::xxxx<int, A<double>>::value false std::xxxx<int, A<double>>::value編譯時的std::xxxx<int, A<double>>::value 這該怎么做?

您可以執行以下操作:

#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>;

可以編寫專用特征:

#include <type_traits>

template<typename T, typename TA> struct
has_parameter: public ::std::false_type
{};

template<typename T> struct
has_parameter<T, A<T>>: public ::std::true_type
{};

template<typename T, typename TA> 
constexpr bool const has_parameter_v = has_parameter<T, TA>::value;

static_assert(has_parameter_v<double, A<double>>);    
static_assert(!has_parameter_v<int, A<double>>);

如果你能修改你的AA我會添加你可以檢查的別名

template <class T>
class A
{
public:
    using type = T;
};

然后例如

int main()
{
    std::cout << std::is_same<double, A<double>::type>::value << '\n';
    std::cout << std::is_same<int, A<double>::type>::value;
}

輸出是

1
0

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM