C++ 如何使用 Lambda 参数创建虚拟函数

Kem*_*mal 5 c++ polymorphism lambda templates

我在下面的代码中的目的是能够调用一个以lambda作为参数的虚函数。我的处理方式显然是不对的,因为虚拟模板是不允许的。

有办法解决吗?

// polymorphic base class
struct B {
    virtual void    set_val(int)    = 0;
    virtual int     get_val()       = 0;
    virtual void    set_next(B*)    = 0;

    template<typename FCall_T>  // compiler error: no virtual templates allowed
    virtual void for_each_node_do(FCall_T) = 0;
};

// derived class
struct D :
    public B
{
    int     val;
    D*      p_next;

    void    set_val(int i)      override { val = i; }
    int     get_val()           override { return val; }
    void    set_next(B* p_next_)override { p_next = dynamic_cast<D*>(p_next_); };

    template<typename FCall_T>
    void for_each_node_do(FCall_T fnc) override {
        fnc(this);

        D* p_cur = p_next;
        while(p_cur) {
            fnc(p_cur);
            p_cur = p_cur->p_next;
        }
    }
};

int main() {
    // set up linked list
    int cnt = 5;
    B** ppB = new B*[cnt];      // array of base class ptrs
    for(int i = 0; i < cnt; ++i)
        ppB[i] = new D;
    for(int i = 0; i < cnt; ++i) {
        ppB[i]->set_val(i);
        ppB[i]->set_next( (i < cnt-1) ? ppB[i+1] : nullptr);
    }
    B* p_root = ppB[0];         // base class ptr

    // do something thru base class ptr
    p_root->for_each_node_do(
        [](B* pB){
            pB->set_val(pB->get_val() * 10);
        }
    );

    // do something else thru base class ptr
    p_root->for_each_node_do(
        [](B* pB){
            cout << pB->get_val() << endl;
        }
    );

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我考虑声明B::for_each_node_do()为:

virtual void for_each_node_do(void(*)(B*)) = 0;
Run Code Online (Sandbox Code Playgroud)

...并根据需要声明尽可能多的自由函数用作其参数,但正如我上面所说,我想知道是否有一种方法可以使其使用lambda作为其参数。