2017-06-12 167 views
0

我有一个C类应该有一些成员。但是这个成员应该自动添加到地图中,这样我就可以通过字符串轻松访问它们。C++通过字符串在类中调用成员

这样的想法是有一个结构称为参数和结构保存到一个地图或其他什么东西......

但我不舒尔我应该如何使用地图。我的想法是用指向成员值的指针创建一个映射。但是如何在struct构造函数中初始化这个成员?

template <typename C> 
    struct parameter { 
    typedef int (parameter::*mfp)(int); 
    static std::map<std::string, mfp> registered_parameter; 

    parameter(std::string name) { 
     // todo... 
    } 

    // parameter overloading code and something other here ... 
    }; 

该模板是为每个类都有一个静态地图。 C1和C2类应该有不同的地图。

C1 could be look: 
class C1: public C { 
    parameter<C1> x("x"); 
    parameter<C1> y("y"); 
} 

而且,如果我做这样的事情:

C1 c1_1; 
C1 c1_2; 

// should be different x 
c1_1.x = 2 
c1_2.x = 3 
+3

C++不能这样工作。 –

+0

'mfp'是成员函数的指针,而不是指向成员值的指针。 'parameter'没有任何'mfp'可指向的成员。 'c1_1.x'是一个'parameter',但它没有'operator =(int)'来产生'c1_1.x = 2;'compile。请尝试充实这个问题,并展示一个您想要编写的代码示例,假定'parameter'完成您想要的任务。目前你的例子没有做任何事情。 – nwp

+0

C类中有参数struct我虽然我不需要像重载一样写这个,因为它显然必须有操作符重载。 @nwp我的观点是,我不知道如何将“this”添加到地图中,因此我可以很容易地通过字符串得到它 – R3Tech

回答

0

不知道我怎么可以添加“这种”到地图

而且你可以不知道它,因为this不能被添加到地图中。该地图包含指向parameter成员函数的指针。 this不是parameter的成员函数,而是指向parameter的指针。

由于您似乎打算将字符串映射到作为C成员的参数,因此似乎映射的类型应该是类型参数C的成员指针。此外,我建议制作地图常量。毕竟,课程在运行时不会改变,因此最好避免修改地图,因为它几乎肯定是一个错误。

static const std::map<std::string, parameter C::*> registered_parameter; 

但如何初始化这个成员的结构构造?

您不会在构造函数中初始化静态成员。只有一个静态成员的实例,在构建第一个对象之前应该初始化它。当然,您需要专门为每个班级进行初始化。

静态成员可以专门这样的:

template<> 
const std::map<std::string, parameter<C1> C1::*> 
parameter<C1>::registered_parameter = { 
    {"x", &C1::x}, 
    {"y", &C1::y}, 
}; 

但是请注意,该参数的成员必须公开这个工作。