虚函数和std :: function? [英] Virtual functions and std::function?
问题描述
在C ++ 17中考虑以下代码:
Consider the following code in C++17:
#include <iostream>
#include <functional>
struct base
{
base() {std::cout << "base::base" << std::endl;}
virtual ~base() {std::cout << "base::~base" << std::endl;}
virtual void operator()() {std::cout << "base::operator()" << std::endl;}
};
struct derived1: base
{
derived1() {std::cout << "derived1::derived1" << std::endl;}
virtual ~derived1() {std::cout << "derived1::~derived1" << std::endl;}
virtual void operator()() {std::cout << "derived1::operator()" << std::endl;}
};
struct derived2: base
{
derived2() {std::cout << "derived2::derived2" << std::endl;}
virtual ~derived2() {std::cout << "derived2::~derived2" << std::endl;}
virtual void operator()() {std::cout << "derived2::operator()" << std::endl;}
};
int main(int argc, char* argv[])
{
base* ptr1 = new derived1();
base* ptr2 = new derived2();
std::function f1(*ptr1);
std::function f2(*ptr2);
std::invoke(*ptr1); // calls derived1::operator()
std::invoke(*ptr2); // calls derived2::operator()
std::invoke(f1); // calls base::operator()
std::invoke(f2); // calls base::operator()
delete ptr1;
delete ptr2;
return 0;
}
std::function
似乎对虚函数没有做正确的事.有什么方法可以使std::invoke(*ptrN)
和std::invoke(fN)
行为相同?还是有什么办法可以创建一个新的处理虚拟函数的函数包装器?
std::function
does not seem to do the right thing with virtual functions. Would there be any way to make std::invoke(*ptrN)
and std::invoke(fN)
behave the same way? Or would there be any way to create a new function wrapper that would deal with virtual functions?
推荐答案
您可以使用std::reference_wrapper
或便捷的std::ref
.在这种情况下,std::function
将使用SOO(小对象优化),因此不会复制/移动对象(避免使用
You can use a std::reference_wrapper
, or the convenient std::ref
. std::function
will use SOO (small object optimization) in this case, so the object won't be copied/moved (avoiding the slicing problem). However, you won't get the deduction guide so you need to specify the template arguments.
std::function<void()> f1(std::ref(*ptr1));
std::function<void()> f2(std::ref(*ptr2));
这篇关于虚函数和std :: function?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!