假设我们有这样的元函数:
template<typename LHS , typename RHS>
struct add;
我们有一组已知类型的特化。例如,完整的包装器:
template<typename T1 , T1 VALUE1 , typename T2 , T2 VALUE2>
struct add<std::integral_constant<T1,VALUE1>,std::integral_constant<T2,VALUE2> : public std::integral_constant<std::common_type_t<T1,T2>,VALUE1+VALUE2> {}; //Take advantage of C++14 helpers
前几天,我们新建了一个类,专门为这个类添加:
template<typename X , typename Y>
struct point_2d
{
using x = X;
using y = Y;
};
template<typename X1 , typename Y1 , typename X2 , typename Y2>
struct add<point_2d<X1,Y1>,ppoint_2d<X2,Y2>> : public point_2d<add<X1,X2>,add<Y1,Y2>> {};
如您所见,我使用add
元函数来执行坐标的添加。因此,任何具有 add 元功能专业化的类型都可以用作point_2d
坐标。
我的问题是:有什么方法可以检查模板是否具有以给定类型作为参数的专业化?
像这样的东西:
template<template<typename...> class TEMPLATE , typename... Ts>
struct has_specialization;
template<template<typename...> class TEMPLATE , typename... Ts>
struct has_specialization<TEMPLATE<Ts...> /* TEMPLATE<Ts...> exists */ , Ts...> : public std::true_type {};
template<template<typename...> class TEMPLATE , typename... Ts>
struct has_specialization<TEMPLATE<Ts...> /* TEMPLATE<Ts...> doesn't exists */ , Ts...> : public std::false_type {};