是否可以创建模板别名?

时间:2015-03-12 20:07:45

标签: c++ c++11 c++14 type-alias

请考虑以下代码:

template< template< typename ... > class ... Ts >
struct unite
{
    template< typename ... T >
    struct type
        : Ts< T ... > ...
    { };
};

// This does not work as ::type does not name a type, but a template:

// template< template< typename ... > class ... Ts >
// using unite_t = typename unite< Ts ... >::type;

template< typename > struct debug_none {};
template< typename > struct debug_cout {};

template< typename ... > struct raise_demangled {};
template< typename ... > struct raise_specialized {};

template< typename, typename = int > struct match_default {};

template< template< typename ... > class Control >
void f()
{}

int main()
{
    f< unite< debug_none, raise_demangled, match_default >::type >();

    // Is there any way to create something like unite_t which works like this:

    // f< unite_t< debug_none, raise_demangled, match_default > >();
}

Live example

问题:有没有办法创建某种&#34;模板别名&#34;类似别名?(参见上例中的unite_t

1 个答案:

答案 0 :(得分:5)

不,你不能。

using可以“返回”某个类型或变量。它无法“返回”template。其他地方没有类似的机制。

你可以通过采用所有模板都不是模板的约定来做一些模糊的事情,而是在其中包含template<?>using apply=?;别名的类(当我们在其中时,常量是std::integral_constants<T,?>,并且指针是pointer_constant<T*,?>)。

现在一切都是上课。 template只是类(::apply<?...>

将一组类型应用于此类模板将通过以下方式完成:

template<class Z, class...Ts>
using apply_t = Z::template apply<Ts...>;

因此,使用“原生”模板Z,您需要Z<Ts...>。使用这些“间接”模板,您可以apply_t<Z, Ts...>

使用此约定,模板using别名可以返回间接模板。如果您的其余代码遵循始终调用apply_t来应用模板的约定,并且您间接地使用您编写的所有其他模板,那么我们就完成了。

这太丑了。