如果模板参数是另一个模板的某个实例,则键入trait test

问题描述 投票:0回答:2

假设在下面的代码中,目的是允许T中的Bar<T>为任何Foo<U>U

template<typename U>
class Foo { };

template<typename T, typename = std::enable_if_t< /*T is Foo<U> for any U*/>>
class Bar {
    // ...
};

有什么东西我取代/*T is Foo<U> for any U*/

c++ c++14 sfinae typetraits enable-if
2个回答
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

2
投票

您可以为此创建特征:

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

template <typename T>
struct is_foo<Foo<T>> : std::true_type {};
© www.soinside.com 2019 - 2024. All rights reserved.