【发布时间】:2014-07-08 23:35:14
【问题描述】:
我正在做一个可以在运行时定义的子类系统。我有一个子类转发表的方法(std::map),如果表中没有方法,则使用超类方法。
示例(函数参数和返回类型不是问题,我只是简化了):
class Superclass {
public:
virtual void doSomething();
};
class Superclass_subclass : public Superclass {
public:
std::map< std::string,std::function<void (Superclass_subclass*)> > table;
int doSomething(int a, int b) {
if( table.count("doSomething") == 0 ) return Superclass::doSomething(a,b);
return table.at("doSomething")(this,a,b);
}
};
现在我正在研究宏以简化创建_subclass 类的过程。现在我得到了以下宏:
#define runtime_subclass_begin(Superclass) //...
#define runtime_subclass_method(Superclass,rtype,method,args_def,args_call) //...
#define runtime_subclass_end
#define GROUP(...) __VA_ARGS__
runtime_subclass_begin(Superclass)
runtime_subclass_method(Superclass,int,doSomething,GROUP(int a,int b),GROUP(a,b))
runtime_subclass_end
这对我来说效果很好,除了我必须重复参数,一次使用类型(int a, int b),一次用于调用底层函数(a,b)。我想知道是否有更好的方法来做到这一点。
【问题讨论】:
-
我想知道如何,但你说你已经解决了地图中函数签名的问题。那么可变参数模板可能有用吗?喜欢
template<typename ...Args> void doSomething(Args ...args) { table.at("doSomething")(this, args...) } -
@leemes 这样做是行不通的,因为我需要
doSomething覆盖SuperClass::doSomething,你知道我的意思吗?顺便说一句,我使用void*解决了参数传递问题并将其转换为正确的std::function变体。 -
为什么?您仍然必须将其编写为代码,因此对我来说使用传统的虚函数似乎更明智。而且很有可能快 10-100 倍。
-
@MatsPetersson std::function 是用解释语言定义的,比如 Lua 或 Python。
标签: c++ metaprogramming c-preprocessor