gpt4 book ai didi

c++ - 在最终类中调用静态方法的静态基类构造函数的设计模式

转载 作者:行者123 更新时间:2023-11-28 02:37:49 25 4
gpt4 key购买 nike

如何使用 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 函数指针表)。

最后,我是否可以使用任何更好的技术,以某种方式标记或标记需要注册的方法,并为消费者省去必须在单独的函数中手动注册它们的麻烦?

最佳答案

我相信正规CRTP会工作得很好。这摆脱了 virtualstatic。使用std::once_flag结合std::call_once将允许您只调用该函数一次——模仿“静态构造函数”的效果。它只需要一点点乱七八糟的东西。

完整代码:

#include <iostream>
#include <mutex>

template<typename T>
struct Base {
Base() {
static_cast<T*>(this)->register_all();
}

using F = void(T::*)();

template<F f>
void register_method(const char* str) {
// ...
std::cout << "registered " << str << '\n';
}
};

struct Derived : Base<Derived> {
private:
static std::once_flag flag_;
void implementation() {
register_method<&Derived::foo>("foo");
register_method<&Derived::bar>("bar");
}
public:
void foo() {}
void bar() {}

void register_all() {
std::call_once(flag_, [this]{ implementation(); });
}
};

std::once_flag Derived::flag_;

int main() {
Derived x;
Derived y;
}

Live Demo

关于c++ - 在最终类中调用静态方法的静态基类构造函数的设计模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26947037/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com