是否可以创建模板别名?
Is it possible to create a template 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 > >();
}
问题:有什么方法可以创建某种类似于类型别名的"template alias"吗?(参见上例中的unite_t
)
不,你不能。
using
可以 "return" 一个类型,或者一个变量。它不能 "return" 一个 template
。其他地方没有类似的机制。
你可以做一些模糊有用的事情,方法是采用所有模板都不是模板的约定,而是 class 里面有一个 template<?>using apply=?;
别名的东西(当我们这样做时,常量是std::integral_constants<T,?>
,指针为pointer_constant<T*,?>
).
现在一切都是class。 template
变成 种 种 class 种(带有 ::apply<?...>
.
将一组类型应用到这样的模板将通过以下方式完成:
template<class Z, class...Ts>
using apply_t = Z::template apply<Ts...>;
所以使用 "native" 模板 Z
,你会做 Z<Ts...>
。使用这些 "indirect" 模板,您可以 apply_t<Z, Ts...>
.
根据此约定,模板 using
别名可以 return 间接模板。如果您的其余代码遵循始终调用 apply_t
来应用模板的惯例,并且您间接化了您编写的所有其他模板,我们就完成了。
这很丑。
考虑以下代码:
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 > >();
}
问题:有什么方法可以创建某种类似于类型别名的"template alias"吗?(参见上例中的unite_t
)
不,你不能。
using
可以 "return" 一个类型,或者一个变量。它不能 "return" 一个 template
。其他地方没有类似的机制。
你可以做一些模糊有用的事情,方法是采用所有模板都不是模板的约定,而是 class 里面有一个 template<?>using apply=?;
别名的东西(当我们这样做时,常量是std::integral_constants<T,?>
,指针为pointer_constant<T*,?>
).
现在一切都是class。 template
变成 种 种 class 种(带有 ::apply<?...>
.
将一组类型应用到这样的模板将通过以下方式完成:
template<class Z, class...Ts>
using apply_t = Z::template apply<Ts...>;
所以使用 "native" 模板 Z
,你会做 Z<Ts...>
。使用这些 "indirect" 模板,您可以 apply_t<Z, Ts...>
.
根据此约定,模板 using
别名可以 return 间接模板。如果您的其余代码遵循始终调用 apply_t
来应用模板的惯例,并且您间接化了您编写的所有其他模板,我们就完成了。
这很丑。