首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++类型擦除,用std::function捕获单个类的多个方法

C++类型擦除,用std::function捕获单个类的多个方法
EN

Stack Overflow用户
提问于 2016-01-15 21:33:35
回答 1查看 168关注 0票数 1

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

代码语言:javascript
复制
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-pointers,也不是相应的基于继承的实现。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-01-15 21:42:21

使用shared_ptr创建一个副本,并捕获它。

代码语言:javascript
复制
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); }
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34820217

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档