我能做些什么来完成这项工作:
template<class C, class V, Test V::*>
class Test {
};
Run Code Online (Sandbox Code Playgroud)
它给了我编译器错误:
unknown type name 'Test'
Run Code Online (Sandbox Code Playgroud)
它现在是一个自引用模板,似乎不可能.有什么办法可以让它发挥作用?
编辑:
这就是我需要的东西.我想用最少的编码工作来实现双向(思考父子)关系模式.
template <class O, class T, Reference<T, O, Reference O::*> T::* opposite>
class Reference
{
T **data;
int count;
public:
Reference(): data(new T*[N]), count(0) {}
~Reference() {delete[] data;}
Reference &add(T *t) {
handleOtherSide();
return link(t);
}
// a lot of stuff to implement this
};
Run Code Online (Sandbox Code Playgroud)
那是集合类.以下是它的使用方法:
class Partner
{
public:
Reference<Partner, Address, &Address::partner> addresses;
};
class Address
{
public:
Reference<Address, Partner, &Partner::addresses> partner;
};
Run Code Online (Sandbox Code Playgroud)
我的目标是让参考工作所需的一切都作为模板参数提供,这样就不需要为像Partner和Address这样的类提供构造函数(目前我提供相反的成员指针作为构造函数arg,但这需要我有参与者类的显式构造函数).我还需要传入或计算一个指向Reference类的"owner"指针.我在这里留下了这个问题因为我想专注于自引用模板方面.
最简单的想法是boost :: bimap.但是bimap的问题在于我不想要封闭的bimap,而只需要它的左右两部分.bimap也不可行,因为它会导致一个单一的bimap管理特定关系的所有关联.它可能会容纳大量对象,从而减慢对它的操作.
问题是,我想要实现的目标在 C++ 中是不可能的,至少对于模板以及我想要的代码和类的数量来说是不可能的(阅读:每个成员单行代码)。它从需要前向声明和完全定义类型的编译器开始,这使得按值成员和模板参数变得不可能(在循环依赖的情况下)。那么当该成员的类尚未完全定义时,就不可能将成员指针作为模板参数。所有这一切的根本原因是编译器的工作方式:它是单通道的。我对此无能为力。
解决方案是使用引用成员或 OO 样式基类或 boost::any 样式容器来避免使用模板。对于后两者,可能有按值成员。