使用typedef将多个模板类组合到一个类中

时间:2015-06-16 18:43:33

标签: c++ templates macros typedef

我有以下代码。 让我们有功能声明和实现 单独的

#include <iostream> 

class Y1 {}; 
class Y2 {}; 

template <class T1, class T2> 
class A
{   
    public:
        explicit A();
        void foo() const;
        int bar() const;
};  

template <class T1, class T2> 
A<T1, T2>::A() {}

template <class T1, class T2> 
void A<T1, T2>::foo() const {}

template <class T1, class T2> 
int A<T1, T2>::bar() const {}

int main() {
    A<Y1, Y2> a;
    a.foo();


    A<Y1, Y2> *a2 = new A<Y1, Y2>();
    a2->foo();

    return 0;
}   

每次写作都很痛苦

template <class T1, class T2>

用于每个对象声明和函数声明。

有人可以帮助使用宏或typedef来缩短 模板参数说明。

2 个答案:

答案 0 :(得分:2)

首先,最好在类定义本身中实现这些函数。然后,你的问题就完全消失了。

如果你必须在外面实现这些功能,你可以使用类似下面的宏来获得简单的返回类型。:

#define A_FUNC(ret, name) \
template <class T1, class T2> \
ret A<T1, T2>::name

A_FUNC(void, foo)() const {}

A_FUNC(int, bar)()  const { return 0;}

但是,对于复杂的返回类型,该逻辑将会崩溃。说你有:

template <class T1, class T2> 
class A
{   
    public:
        explicit A() {}
        void foo() const;
        int bar() const;
        char const* (*)(int, int) bar2() const;
};  

我不知道是否有办法将该返回类型捕获为宏参数。

使用

A_FUNC((char const* (*)(int, int)), bar2)()  const { return NULL;}

会导致各种编译错误。

答案 1 :(得分:0)

在我自己的代码中,我还将声明与实现分开。有时我只需要代码就知道存在模板,更常见的是我希望能够很容易地看到接口是什么。

我用宏解决了这种繁琐的输入。但是,解决方案很复杂。

如果您的返回类型没有逗号(即排除std::unordered_map<int, std::string>等案例),这里是一个简单的实用程序宏:

#define TEMPLATE2(returnType, className, type1, type2) \
   template<typename type1, typename type2> returnType className<type1, type2>::

你可以像这样使用它:

TEMPLATE2(, A, T1, T2)::A() { ... }

TEMPLATE2(int, A, T1, T2)::bar() const { ... }

您可以拥有TEMPLATE1TEMPLATE3等等,以获得越来越多的模板参数。但是,您也可以将其拆分为两个宏:一个生成类型列表,另一个生成特化。我已经完成了它们,但相信我,甚至不喜欢它。它不缺乏预处理技能,我可以告诉你没有令人满意的方法来避免这种措辞。