Вчера я задал вопрос (Как узнать, является ли тип шаблонным типом любого типа?) о том, как проверить конкретный аргумент шаблона, если этот аргумент является шаблонным классом любого типа. И решение было примерно таким:
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:
- Имеет несколько аргументов шаблона и
- Один из аргументов не тип, а целое число
Как это сделать?
<auto integer>
вместо<typename T, T integer>
. Это может упростить некоторые вещи. Хотя это зависит от конкретного варианта использования. У вас может быть<typename T, T first, T second>
, который не совпадает с<auto first, auto second>
. - person Indiana Kernick   schedule 07.04.2021