如果模板参数是另一个模板的实例化,则键入特征测试

时间:2018-10-10 21:24:25

标签: c++ c++14 sfinae typetraits enable-if

假设以下代码的目的是允许T中的Bar<T>成为任何Foo<U>的{​​{1}}。

U

我可以用template<typename U> class Foo { }; template<typename T, typename = std::enable_if_t< /*T is Foo<U> for any U*/>> class Bar { // ... }; 代替吗?

2 个答案:

答案 0 :(得分:4)

您可以编写一个通用特征以匹配任何专业化:

template <typename T, template <typename...> class Z>
struct is_specialization_of : std::false_type { };

template <typename... Args, template <typename....> class Z>
struct is_specialization_of<Z<Args...>, Z> : std::true_type { };

您的具体情况是:

is_specialization_of<T, Foo>::value // <== T is some kind of Foo

答案 1 :(得分:2)

您可以为此创建特征:

template <typename T>
struct is_foo : std::false_type {};

template <typename T>
struct is_foo<Foo<T>> : std::true_type {};