我有类似
的东西template <typename T>
T func1() { /* ... */ }
template <typename T>
T func2() { /* ... */ }
// many other functions which use the same template line
如果我试试这个
template <typename T>
T func1() { /* ... */ }
T func2() { /* ... */ }
我收到编译错误。
是否可以只编写一次template
部分并使代码正常工作?
答案 0 :(得分:5)
不,在C ++中你不能这样做(但是你可以使用D编程语言),而不是
namespace detail {
template<class T> func1() { /* */ }
template<class T> func2() { /* */ }
}
你可以使用
template<class T>
struct detail
{
static T func1() { /* */ }
static T func2() { /* */ }
};
如果您想同时和部分地专门化所有功能(您不能部分专门化功能模板,但您可以使用类模板),这将变得更有利。
注意:有一个缺点:命名空间对新功能是开放的,但是类不是,除非你控制它们的来源,所以你最好确定要组合在一起。
答案 1 :(得分:1)
如果您不得不重复模板参数声明的次数太多次,可以将函数包装到模板结构或类中
e.g。
template <typename T> struct Wrapper {
static T func1() { /* ... */ }
static T func2() { /* ... */ }
};
答案 2 :(得分:0)
如果您无法更改功能签名,可以执行定义来执行此操作:
#define Templated_T template<class T> T
Templated_T func1() { /* ... */ }
Templated_T func2() { /* ... */ }
它不是非常C ++ - 但是应该正常工作。