【发布时间】:2014-11-15 14:48:50
【问题描述】:
如何使用 C++11 实现以下设计:
class Consumer : Base<Consumer>
{
// different consumers will have different methods (of the same signature)
void Foo(){...}
void Bar(){...}
: // etc.
static void override
register_all () {
register_method<&Consumer::Foo>("foo");
register_method<&Consumer::Bar>("bar");
: // etc.
}
:
}
template<typename T>
class Base
{
static
Base() {
register();
}
virtual static void
register_all(){ };
using F = void(T::*)();
template<F f>
static void
register_method(std::string name) {
...
}
}
...?
请注意,我在做两件违法的事情:
- 我在基类上使用静态构造函数(不允许)
- 我正在使用虚拟静态函数(也不允许)
注意:方法的注册只需要发生一次,在访问第一个实例之前(它将填充静态 C 函数指针表)。
最后,我可以使用什么更好的技术,以某种方式标记或标记需要注册的方法,并省去消费者必须在单独的函数中手动注册它们的麻烦?
【问题讨论】:
-
register是 C++ 中的关键字。 -
我不明白你在这里做什么。有太多想象的结构在起作用,很难理解整体观点。
-
您要注册的方法的名称是已知的并且是全局固定的,还是每个派生类自己决定注册什么?
-
谢谢,问题已编辑!
标签: c++ design-patterns c++11 static virtual-functions