gpt4 book ai didi

c++ - 特征类中的成员函数 "name"? (通用适配器)

转载 作者:行者123 更新时间:2023-11-30 01:23:49 26 4
gpt4 key购买 nike

我已经使用 CRTP 实现了一项政策。该策略需要 Base类有一个名为 foo 的函数:

template<typename Base>
struct Policy<Base> {
// ...
Base* b(){ return static_cast<Base*>(this); }
void do(){ b()->foo(); }
};

我有一门课叫Widget使用我的政策。 Widget工具 foo一切都很好:

struct Widget : Policy<Widget> {
// ...
void foo();
};

问题:我还有一个类型叫做 OldWidget实现了 foo 的功能在名为 oldFoo 的函数中:

struct OldWidget : Policy<OldWidget> {
// ...
void oldFoo();
};

不想修改 OldWidget(除了用策略扩展它)。我不想使用 AdaptedOldWidget :

struct AdaptedOldWidget : OldWidget, Policy<AdaptedOldWidget> {
void foo(){ oldFoo(); }
};

最好的办法是扩展我现有的 policy_traits类到类似的东西:

template<typename T>
struct policy_traits {};

template<>
struct policy_traits<Widget> {
// typedefs...
member_function_name = foo;
};

template<>
struct policy_traits<OldWidget> {
// typedefs
member_function_name = oldFoo;
};

这样我就可以像这样实现政策:

template<typename Base>
struct Policy<Base> {
// ...
Base* b() { return static_cast<Base*>(this); }
void do(){ b()->policy_traits<Base>::member_function_name(); }
};

有没有办法在 C++ 中实现类似的东西?

建议的解决方案:我可以执行以下操作:

template<typename Base>
struct Policy<Base> : Policy_Member_Traits<Base> {
// ...
Base* b(){ return static_cast<Base*>(this); }
void do(){ foo_wrapper(); }
};

template<typename T> struct Policy_Member_Traits { };
template<> struct Policy_Member_Traits<Widget> {
void foo_wrapper(){ static_cast<T*>(this)->foo(); }
};
template<> struct Policy_Member_Traits<OldWidget> {
void foo_wrapper(){ static_cast<T*>(this)->oldFoo(); }
};

希望有更好更简单的方法来实现这一目标。

最佳答案

首先:所有函数的签名必须相同。然后你可以在你的 policy_traits 中设置一个带有成员函数地址的静态成员,这样你就可以稍后调用所需的函数(从你的 Policy 模板)使用

typedef void (*void_memfn_type)();

template<>
struct policy_traits<Widget> {
static void_memfn_type const member_function_name = &Widget::foo;
};

template<>
struct policy_traits<OldWidget> {
static void_memfn_type const member_function_name = &OldWidget::oldFoo;
};

然后:

template<typename Base>
struct Policy<Base> {
// ...
Base* b() { return static_cast<Base*>(this); }
void do(){ b()->policy_traits<Base>::(*member_function_name)(); }
};

关于c++ - 特征类中的成员函数 "name"? (通用适配器),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14454613/

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