шаблон псевдонима для шаблона участника - PullRequest
5 голосов
/ 06 мая 2019

допустим, у меня есть шаблон:

template<typename T>
struct Outer {
    template<typename T1>
    struct Inner {

    };
};

Я хотел бы иметь шаблон псевдонима Alias:

template<typename T>
using Alias = Outer<T>::template Inner; // this won't work

using IntOuter = Alias<int>;

, чтобы IntOuter<double> было таким же, как Outer<int>::template Inner<double>.Как вы определяете Alias?Или это возможно?

Редактировать:

Я хотел бы иметь возможность создавать SomeOuter на лету, чтобы для шаблона foo:

template<template<typename> class>
struct Foo {
};

Foo<Alias<int>> совпадает с Foo<Outer<int>::template Inner>

Или сделать что-то вроде этого:

template<typename T>
using SomeFoo = Foo<Alias<T>>;

Ответы [ 2 ]

4 голосов
/ 06 мая 2019

Вы могли бы

template<typename T, typename T1>
using Alias = typename Outer<T>::template Inner<T1>;

template<typename T1>
using IntOuter = Alias<int, T1>;

или напрямую

template<typename T1>
using IntOuter = Outer<int>::Inner<T1>;

Тогда для IntOuter<double> вы получите Outer<int>::Inner<double>.

ЖИТЬ

1 голос
/ 06 мая 2019

Вы не можете делать то, что просите.

Это ответ на ваш вопрос. Вы задаете узкий вопрос без достаточного фона, это лучшее, что я могу сделать.


Если вы хотите сделать серьезное метапрограммирование в C ++, вы можете перенести шаблоны в типы или значения. Смотрите подходящую библиотеку Hana для одного подхода.

Но никто не будет взаимодействовать с

template<template<typename> class>
struct Foo {
};

«Из коробки».

template<class T>struct tag_t{using type=T;};
template<class T>constexpr tag_t<T> tag{};
template<template<class...>class Z>struct ztemplate_t{
  template<class...Ts>using apply=Z<Ts...>;
  template<class...Ts>
  constexpr tag_t<Z<Ts...>> operator()(tag_t<Ts>...)const{return {};}
};
template<template<class...>class Z>constexpr ztemplate_t<Z> ztemplate{};
template<class Tag>using type_t=typename Tag::type;
#define TYPE(...) type_t<decltype(__VA_ARGS__)>

Теперь

template<typename T>
constexpr auto Alias = ztemplate<Outer<T>::template Inner>;

теперь значение, которое действует как шаблон.

Отображение Foo на:

template<template<class...>class Z>
constexpr tag_t<Foo<Z>> foo( ztemplate_t<Z> ){return {};}

позволяет вам сделать TYPE( foo(Alias( tag<int> ) ) ).

Это, вероятно, не то, что вы хотите.

...