诀窍是创建一个帮助类型,告诉你某事是否是C<Foo>
:
template <typename T> struct C {};
template <typename T> struct is_C {
static bool const value = false;
};
template <typename T> struct is_C<C<T>> {
static bool const value = true;
};
你在正确的轨道上,enable_if
但is_same
似乎是一个死胡同:
#include <type_traits>
template <typename T1, typename T2, typename Enabled = void> struct Trait {
static char const test = 'D'; // default
};
template <typename T> struct Trait<
T,
T,
typename std::enable_if<!is_C<T>::value >::type
> {
static char const test = 'N'; // non-C
};
template <typename T1, typename T2> struct Trait<
T1,
T2,
typename std::enable_if< is_C<T1>::value && is_C<T2>::value >::type
> {
static char const test = 'C'; // some C
};
您现在可以轻松测试:
#include <iostream>
int main() {
Trait< C<int>, C<float> > foo1a;
Trait< C<int>, C<int> > foo1b;
Trait< int, int > foo2;
Trait< int, float > foo3;
std::cout << "Trait<C<int>,C<float>> : " << foo1a.test << std::endl; // prints 'C'
std::cout << "Trait<C<int>,C<int>> : " << foo1b.test << std::endl; // prints 'C'
std::cout << "Trait<int,int> : " << foo2.test << std::endl; // prints 'N'
std::cout << "Trait<int,float> : " << foo3.test << std::endl; // prints 'D'
return 0;
}
如果您希望您的专业化仅使用参数之一是 aC
或您喜欢的任何参数,您可以轻松地更改它。