我有以下代码。 让我们有功能声明和实现 单独的
#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来缩短 模板参数说明。
答案 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 { ... }
您可以拥有TEMPLATE1
,TEMPLATE3
等等,以获得越来越多的模板参数。但是,您也可以将其拆分为两个宏:一个生成类型列表,另一个生成特化。我已经完成了它们,但相信我,甚至不喜欢它。它不缺乏预处理技能,我可以告诉你没有令人满意的方法来避免这种措辞。