我可以使用decltype()来避免显式模板实例化中的代码重复吗?

时间:2016-04-11 20:45:33

标签: c++ templates code-duplication decltype explicit-instantiation

我有一个很长的模板函数声明:

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()以其他方式避免复制实例化的声明吗?

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

1 个答案:

答案 0 :(得分:3)

不确定。来自[temp.explicit]:

  

显式实例化的语法是:
  显式实例
  extern opt template 声明

     

[...]如果显式实例化是针对函数或成员函数的,则声明中的 unqualified-id 应为 template-id 或者,其中可以推导出所有模板参数,a    template-name operator-function-id [注意:声明可能会声明 qualified-id ,在这种情况下    qualified-id unqualified-id 必须是 template-id -end note]

我们需要一份声明。让我们假装我们开始:

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>不起作用的原因是它不是声明。你也需要这个名字。