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

时间:2016-10-31 12:09:31

标签: c++ templates lambda polymorphism

我在以下代码中的意图是能够使用 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;
}

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

virtual void for_each_node_do(void(*)(B*)) = 0;

...并根据需要声明尽可能多的自由函数作为参数使用,但正如我上面所述,我想知道是否有办法使 lambdas 作为参数

0 个答案:

没有答案