我已经使用 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(); }
};
必须希望有一种更好更简单的方法来实现这一目标。