如果你正在查看一些代码库,你会看到类似的东西:
class A {
virtual ~A() = default;
virtual void act() = 0;
};
你可能会说:“哦,这基本上只是一个类函数对象的接口,或者如果你愿意的话,或者仿函数,没有输入也没有输出。你可能只是放弃整个东西,而不是写:
void foo(A& a) { a.act(); }
你可以写:
template <std::derived_from<A> F>
void foo() { f(); }
(当然,假设您在编译时知道您的类型;此外,您可以在早期版本的 C++ 中使用
static_assert()
或 std::enable_if
执行此操作以强制 F
从 A
派生)
现在假设您看到以下基类定义:
class B {
virtual ~B() = default;
/// callbacks are invoked after act() concludes
void addCallback(const CallbackType& callback);
virtual void act() = 0;
};
即它“不仅仅是”一个(有状态的)仿函数,而且还带有一系列回调。
什么样的通用成语现在可以代替函数:
void foo(A& a) { a.act(); }
避免定制B级?
备注:
a
的确切类型在编译时已知。std::variant
的所有后代的 B
,那不是我要找的。