C ++ 11添加了别名模板,例如:
template<typename T> using identity = T;
template<bool b, typename T = void> using EnableIf = typename std::enable_if<b, T>::type;
这些比在template
字段中提供返回值的旧::type
类型映射更容易使用,因为即使您的类型参数依赖于本地上下文,也不会需要通知编译器结果是一个类型。
实际上,您将typename
从使用位置提升到using
别名。
是否有任何可以用来摆脱产生的无关template
的东西?
假设您有一个元函数,其输出是类或别名模板而不是类型。目前的方法是这样的:
template<typename T>
struct my_meta {
template<typename U>
using Template = identity<U>;
};
template<typename T>
struct my_meta {
template<typename U>
using Template = int;
};
我们可以这样使用:
template<typename T, typename U>
typename my_meta<T>::template Template<U>
do_stuff( U&& ) { return {}; }
返回类型中存在额外的template
关键字,以消除我的元函数返回值的歧义,这是我想要消除的。
有没有办法向编译器指出metacomputut的结果是C ++ 11或C ++ 1y中的另一个别名或类模板,而不在调用位置使用template
关键字?
即:
template<typename T, typename U>
my_meta_template<T><U>
do_stuff( U&& ) { return {}; }
甚至
template<template<typename> class Template>
void do_more_stuff() {}
template<typename T>
void do_stuff() {
// syntax I want: just produce an alias or class template directly:
do_more_stuff< my_meta_template<T> >();
// vs what I find is required: the disambiguator:
do_more_stuff< my_meta<T>::template Template >();
};
答案 0 :(得分:3)
我知道移除template
的最佳方法是做一个简单的整经工作,为您做到这一点:
template<typename Meta, typename U>
using apply = typename Meta::template Template<U>;
以及之前使用的每个地方template<typename> class Template
都将其替换为typename Meta
。
template<typename Meta>
void do_more_stuff()
{
apply<Meta, int>::func(); //=== Meta::template Template<int>::func();
}
template<typename T>
void do_stuff() {
do_more_stuff< my_meta<T> >();
do_more_stuff< my_meta<T> >();
};