我可以使用 decltype() 来避免显式模板实例化中的代码重复吗?
Can I use decltype() to avoid code duplication in explicit template instantiations?
我有一个很长的模板函数声明:
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()
其他方式来避免复制实例化的声明吗?
注意:我特意使用了一个例子,在这个例子中你不能仅仅从参数中推断出类型,因为我想要任何解决方案也支持这种情况。
当然可以。来自 [temp.explicit]:
The syntax for explicit instantiation is:
explicit-instantiation:
externopt template
declaration
[...] If the explicit instantiation is for a function or member function, the unqualified-id in the declaration shall be either a template-id or, where all template arguments can be deduced, a
template-name or operator-function-id. [ Note: The declaration may declare a qualified-id, in which case the
unqualified-id of the qualified-id must be a 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>
不起作用的原因是它不是声明。你也需要这个名字。
我有一个很长的模板函数声明:
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()
其他方式来避免复制实例化的声明吗?
注意:我特意使用了一个例子,在这个例子中你不能仅仅从参数中推断出类型,因为我想要任何解决方案也支持这种情况。
当然可以。来自 [temp.explicit]:
The syntax for explicit instantiation is:
explicit-instantiation:
externopttemplate
declaration[...] If the explicit instantiation is for a function or member function, the unqualified-id in the declaration shall be either a template-id or, where all template arguments can be deduced, a template-name or operator-function-id. [ Note: The declaration may declare a qualified-id, in which case the unqualified-id of the qualified-id must be a 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>
不起作用的原因是它不是声明。你也需要这个名字。