C++ 类型擦除,捕获单个 class 和 std::function 的多个方法
C++ type erasure, capture multiple methods of a single class with std::function
考虑下面的代码,其中std::function
被使用了三次来捕获一个class的方法:
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;
};
然而,这将执行 class some_expensive_to_copy_class
的三份副本,这是低效的,正如名字所猜到的那样。
有没有只制作一份副本的解决方法?
为了强调这一点,我在这里对使用 std::function
的方法感兴趣,而不是 void
指针,也不是相应的基于继承的实现。
使用 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); }
考虑下面的代码,其中std::function
被使用了三次来捕获一个class的方法:
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;
};
然而,这将执行 class some_expensive_to_copy_class
的三份副本,这是低效的,正如名字所猜到的那样。
有没有只制作一份副本的解决方法?
为了强调这一点,我在这里对使用 std::function
的方法感兴趣,而不是 void
指针,也不是相应的基于继承的实现。
使用 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); }