我有一个模板类A
,我知道T
取决于哪个类调用它。
例如,有10个类将使用A类,10个类中的一个称为file1
。
我可以编写类file1
中显示的代码吗?
class D;
template<typename T>
class A
{
protected:
int a;
int b;
static T *ptr;
public:
static void set_a(int aa){ a = aa; }
static D *create()
{ return new T(); }
};
我可以做以下的事情
class file1
{
#define T file1
A<T>
#undef
.....other data member vs member function
}
class file2
{
#define T file2
A<T>
#undef
.....other data member vs member function
}
原始代码如下:
其中anotherMacro1是
#define anotherMacro1(method)\
public:\
static return_type functionname(passingtype *ptr1, passingtype *ptr2)\
{\
return ((T *)ptr1)->method(ptr2);\
}
=============================================== =======================
A也是一个宏
喜欢
#define A \
protected:\
int a;\
int b;\
static T *ptr;\
public:\
static void set_a(int aa){ a = aa; }\
static D *create()\
{ return new T(); }
=============================================== ===============================
class file1_orginal
{
#define T file1_orginal
A()
anotherMacro1(passingValue);
anotherMacro2(passingValue);
#endif
.....other data member vs member function
}
首先我要删除A中的宏,所以我使用A类来替换宏A.
答案 0 :(得分:2)
严格地说,是的,你可以这样做。实际上我不确定我认为有什么价值:
#define T file1
A<T>
#undef T
与
A<file1>
然而,你肯定让整个事情变得不那么可读了。重点是什么?这似乎是寻找问题的解决方案。我无法想象这是一个解决问题的问题。
好的,所以考虑到你的示例宏,我建议逐步重构模板。在宏内部使用“受保护”的可见性是值得怀疑的,但我们会保留它。我从这开始:
template<class CRTP> //Curiously Recurring Template Pattern
class A {
protected:
int a;
int b;
static CRTP *ptr;
public:
void set_a(int aa){ a = aa; }
static D *create() { return new CRTP(); } //D is a base class?
};
然后:
class file1 : public A<file1> {
#define T file1
anotherMacro1(passingValue);
anotherMacro2(passingValue);
#undef T
...
};
这使用curiously recurring template pattern来转发A中的成员。我从来没有尝试过基类中受保护的成员,但我似乎记得受保护的成员是继承的,并作为受保护的成员继续使用遗产。我认为这些受保护成员的设计需要很差,并且会将它们重构为访问器功能,但我认为这可以满足您的需求。稍后您可以重构另一个Macro1和另一个Macro2的内容。