Как проверить, относится ли аргумент шаблона к определенному шаблонному типу (параметры нескольких типов)

Вчера я задал вопрос (Как узнать, является ли тип шаблонным типом любого типа?) о том, как проверить конкретный аргумент шаблона, если этот аргумент является шаблонным классом любого типа. И решение было примерно таким:

template <typename T>
struct Animal{};

template <typename T>
struct IsAnimalOfAnyType
{
    constexpr bool value() { return false; }
};

template <typename T>
struct IsAnimalOfAnyType<Animal<T>>
{
    constexpr bool value() { return true; }
};

Однако это работает с шаблонами с одним аргументом, но я пытаюсь сделать следующее:

template <typename T, T integer, typename U>
struct Animal{};

template <typename T>
struct IsAnimalOfAnyType
{
    constexpr bool value() { return false; }
};


template <typename T> 
struct IsAnimalOfAnyType<Animal<T>>
{
    constexpr bool value() { return true; }
};

/* Animal needs to be Animal<T, integer, U>,
  but 'T', 'integer' and 'U' template arguments are not available here,
  and if I have these arguments here
  then IsAnimalOfAnyType is no longer a specialization and it won't compile
*/

Насколько я понимаю, разница в том, что структура Animal:

  1. Имеет несколько аргументов шаблона и
  2. Один из аргументов не тип, а целое число

Как это сделать?


person Zebrafish    schedule 07.04.2021    source источник
comment
Начиная с C++17, вы можете использовать <auto integer> вместо <typename T, T integer>. Это может упростить некоторые вещи. Хотя это зависит от конкретного варианта использования. У вас может быть <typename T, T first, T second>, который не совпадает с <auto first, auto second>.   -  person Indiana Kernick    schedule 07.04.2021


Ответы (1)


Вы можете объявить все параметры шаблона, требуемые Animal для специализации.

template <typename T, T integer, typename U> 
struct IsAnimalOfAnyType<Animal<T, integer, U>>
{
    constexpr bool value() { return true; }
};

ПРЯМОЙ ЭФИР

person songyuanyao    schedule 07.04.2021
comment
Является ли это все еще специализацией шаблона ‹typename T› struct IsAnimalOfAnyType { }, даже несмотря на то, что у него три аргумента шаблона вместо одного? Это полное или частичное? - person Zebrafish; 07.04.2021
comment
@Zebrafish Это частичная специализация. Для полной специализации это будет что-то вроде template <> struct IsAnimalOfAnyType<...> { ... };. - person songyuanyao; 07.04.2021