我会用什么来代替定制的带有回调的函子类?

问题描述 投票:0回答:0

背景

如果你正在查看一些代码库,你会看到类似的东西:

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
    ,那不是我要找的。
c++ generics callback idioms
© www.soinside.com 2019 - 2024. All rights reserved.