6

我有很长的模板函数声明:我可以使用decltype()来避免显式模板实例中的代码重复吗?

template <typename T> void foo(lots ofargs, goin here, andeven more, ofthese arguments, they just, dont stop); 

,没有超载。我想明确地实例化它。我可以写(说了T = int):

template void foo<int>(lots ofargs, goin here, andeven more, ofthese arguments, they just, dont stop); 

但我真的不希望复制长的声明。我本来喜欢能够这样说:

template <typename T> using bar = decltype(foo<T>); 

然后:

template bar<int>; 

现在,第一行编译(GCC 4.9.3),但第二行没有按”吨。我可以让它工作吗?或者我可以使用decltype()其他方式避免复制实例的声明?

注意:我使用了一个例子,在这个例子中,你不能只从参数中推断出类型,因为我想要任何解决方案来支持这种情况。

回答

3

当然。从[temp.explicit]:

为显式实例的语法是:
        显式实例化
               的extern 选择template声明

[...]如果显式实例化一个函数或成员函数,在声明中不合格-ID须为模板id或者,所有的模板参数可以推断,一个 模板名称operator-function-id[注:声明可以宣布合格-ID,在这种情况下合格-ID不合格-ID必须是模板id- 结束]

我们需要一个声明。让我们假设,我们开始用:

template <class T> void foo(T) { } 

我们可以通过只明确专注:

template void foo<char>(char); // template-id 
template void foo(int);   // or just template-name, if the types can be deduced 

这是一样写过:

using Fc = void(char); 
using Fi = void(int); 

template Fc foo<char>; 
template Fi foo; 

这是一样的有书面:

template <class T> using F = decltype(foo<T>); 

template F<char> foo<char>; 
template F<int> foo; 

基本上,template bar<int>不起作用的原因是它不是一个声明。你也需要这个名字。

+0

我在编辑这个问题,以确保你不能推导出函数参数的模板参数,这正是我真正感兴趣的。我只是撒了一个T t来衡量好,并不意味着为你使用它...如果你的答案仍然相关,那么很好。 – einpoklum

+0

@einpoklum这个问题并不是很清楚,你为什么认为我的答案不相关? – Barry

+0

我没有说这是无关紧要的,我只是有一种感觉(在你最后一次编辑之前),你可能比你更依赖它。 – einpoklum