使用相同的模板可以获得更多功能

时间:2014-08-06 13:47:09

标签: c++ class templates namespaces function-templates

我有类似

的东西
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部分并使代码正常工作?

3 个答案:

答案 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 ++ - 但是应该正常工作。