C ++类型擦除,使用std :: function

时间:2016-01-15 21:33:36

标签: c++ c++11 type-erasure std-function

考虑以下代码,其中std::function使用三次来捕获一个类的方法:

struct some_expensive_to_copy_class
{
    void foo1(int) const { std::cout<<"foo1"<<std::endl; }
    void foo2(int) const { std::cout<<"foo2"<<std::endl; }
    void foo3(int) const { std::cout<<"foo3"<<std::endl; }
};

struct my_class
{
    template<typename C>
    auto getFunctions(C const& c)
    {
         f1 = [c](int i) { return c.foo1(i);};
         f2 = [c](int i) { return c.foo2(i);};
         f3 = [c](int i) { return c.foo3(i);};
    }

    std::function<void(int)> f1;
    std::function<void(int)> f2;
    std::function<void(int)> f3;
};

然而,这将执行类some_expensive_to_copy_class的三个副本,这是一个低效的,因为人们可能已经猜到了这个名称。

是否有解决方法只能制作一份副本?

为了强调它,我对使用std::function,而不是void - 指针的方法感兴趣,而不是相应的基于继承的实现。

1 个答案:

答案 0 :(得分:5)

使用shared_ptr制作副本,然后捕获该副本。

auto spc = std::make_shared<const C>(c); 
f1 = [spc](int i) { return spc->foo1(i); }
f2 = [spc](int i) { return spc->foo2(i); }
f3 = [spc](int i) { return spc->foo3(i); }