【发布时间】:2012-04-26 09:06:52
【问题描述】:
目前我正在创建一个带有 set 和 get 带有宏的函数的基类。 但是我想添加更复杂的宏,但是宏对于调试来说真的很糟糕,所以我想用模板来做,但我不知道有人知道我的书或链接。
我真正的问题要复杂得多,我只是创建了一个集合并获取示例来演示该问题。
作为一个简单的例子看:
#include <iostream>
#define SETGET_BEGIN(name) \
class name##Base { \
public: name##Base(){};
#define SETGET_VAR(type,name) \
protected: type name##_; \
public: void set##name(const type &_r) {name##_ = _r;} ; \
public: const type &get##name() const {return name##_; }; \
#define SETGET_END };
SETGET_BEGIN(MyClass)
SETGET_VAR(int,NrA)
SETGET_VAR(float,NrB)
SETGET_END
class MyClass : public MyClassBase {
public:
MyClass() : MyClassBase() {};
};
int main(int argc, char **argv) {
MyClass myclass;
myclass.setNrA(4);
return 0;
}
【问题讨论】:
-
模板不能替代宏,它们的用途完全不同。
-
在构造函数/方法声明之后不需要分号 (
;)。 -
通过模板你只能设置你的类成员/函数的类型。您不能设置名称。所以答案是:你不能通过模板来做到这一点。
-
与您的问题无关:我认为您不仅可以创建许多成员变量
protected还可以使用公共 getter 和 setter 访问的设计是非常值得怀疑的。基本上没有封装,你也可以继承struct有两个公共字段。 -
这里的一个关键点是类模板不能包含名称是令牌粘贴结果的成员(
NrA_和set_NrA)。模板可以将类型作为模板参数,但不能像宏那样使用一系列标记。所以你不能简单地使用模板来重现这些宏。
标签: c++ function templates dynamic macros