次のようなメタ関数があるとします。
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
して座標の追加を実行しました。そのため、メタ関数の追加に特化した任意の型を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 {};