【发布时间】:2019-06-24 08:11:20
【问题描述】:
我的问题非常具体。我有以下要求,出于几个原因,我需要从父类设置子类中存在的成员变量。我的计划是在构造时将 setter 方法(存在于子类中)的函数指针(它以字符串作为参数)传递给父类。父类定义了一个以成员名称和值字符串为参数的公共方法,并调用具有值字符串的成员的函数指针。父类可以存在于 dll 或 lib 中,并且无法访问任何转换或工厂方法,因此必须在子类中定义 setter 方法。
由于父类可以是其他类的基类,所以我写了一些宏,如下所示:
#define DEFINE_VAL(Type, memberName) \
private: \
Type memberName; \
void set##memberName(std::string const& val) { \
memberName = convert_to_val(val); /* this will be a call to factory which converts string to value type*/\
/* or call to local implementation for conversion*/
}; \
#define INIT_VAL(memberName) \
{ memberName, \
[&](std::string const& val) { set##memberName(val); }}
父类和子类如下:
// parent.h probably in dll
class parent
{
public:
parent(std::map<std::string, std::function<void(std::string const&)>>& m)
: m(m)
{ }
...
private:
std::map<std::string, std::function<void(std::string const&)>> m;
};
// child.h
class child : public parent
{
public:
child() : parent({ INIT_VAL(iVal), ... })
{ }
private:
DEFINE_VAL(int, iVal);
...
};
子类可以定义许多变量,首先使用 DEFINE_VAL 宏然后使用 INIT_VAL 宏传递每个变量的 setter 方法有点烦人。这可以在一个宏中完成吗(可能在 DEFINE_VAL 中)?或者关于自动注册成员名称和函数指针到父类的任何想法?
如果有任何其他想法来满足我的要求,我也将不胜感激。
【问题讨论】:
-
这是一个占位符还是真的是
...inparent({ INIT_VAL(iVal), ... })? -
如果你不使用宏而是写
child() : member( convert_to_value(iVal) ) {},那么样板就更少了... -
您想要的在当前的代码形式中是不可能实现的。您可以通过使用函数来摆脱宏,但仅此而已。只能在
parent的构造函数中指定映射,限制性很大,使用命名成员就更严格了,因为C++中没有类型自省。 -
@foreknownas_463035818 如果你不使用宏,你至少得有
convert_to_value("iVal", iVal)之类的东西。 -
@LightnessRacesinOrbit 我认为这不是 OP 真正想要的......这看起来更像是某种交换/存储数据结构的通用方式,例如
parent是某种JSON接口,然后你扩展它以便你可以读写它。我不是 OP,所以我可能错了,但这看起来很像。
标签: c++ c++11 reflection macros