Моя цель - записать имя шаблонного типа при определении других типов с параметрами шаблона шаблона. Проблема, с которой я столкнулся, состоит в том, что результирующие типы считаются неэквивалентными.
Для этого я попытался использовать шаблонный "using" псевдоним, чтобы записать имя, указанное в качестве аргумента шаблона шаблона. Затем я ссылаюсь на псевдоним, чтобы восстановить имя. Пример того, где это полезно, - это когда у меня есть шаблонная функция, которая возвращает тип с параметром шаблона шаблона, который должен быть выведен.
В следующем коде показан мой подход:
include <type_traits>
template<typename X>
struct TT {};
template<template<typename> class T>
struct UU {
template<typename X>
using name = T<X>;
};
template<template<typename> class T>
struct VV {};
int main() {
static_assert(std::is_same<
TT<int>,
UU<TT>::template name<int>
>::value, "Templated type instances are distinct");
static_assert(std::is_same<
VV<TT>,
VV<UU<TT>::template name>
>::value, "Template type instances using template names are distinct");
return 0;
}
Компиляция следующим образом:
c++ -std=c++14 Test.cpp -o Test
Урожайность:
Test.cpp:20:3: error: static_assert failed "Template type instances using template names are distinct"
Есть ли другой способ записи и использования имен шаблонов?
Может ли кто-нибудь направить меня к той части стандарта, где указано это поведение?