Введите trait test, если параметр шаблона является каким-либо экземпляром другого шаблона - PullRequest
0 голосов
/ 11 октября 2018

Предположим, в следующем коде предполагается, что 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*/ на

Ответы [ 2 ]

0 голосов
/ 11 октября 2018

Вы можете написать общую черту для соответствия любой специализации:

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
0 голосов
/ 11 октября 2018

Вы можете создать черты для этого:

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

template <typename T>
struct is_foo<Foo<T>> : std::true_type {};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...