我想获取存储在容器中的每个函数的返回类型。我已经尝试了std::any和std::variant,但我无法解决这个问题。详细信息如下:
#include <random>
#include <vector>
#include <functional>
using namespace std;
class Base
{
public: virtual void test() { }
};
class Derived1 : public Base
{
public: virtual void test() { }
};
class Derived2 : public Base
{
public: virtual void test() { }
};
int main ()
{
std::vector<std::function < Base(void)>> b;
b.push_back([&]() { return Derived1(); });
b.push_back([&]() { return Derived2(); });
b.push_back([&]() { return Base(); });
std::shuffle(b.begin(), b.end(), std::default_random_engine {});
for (auto fn : b)
{
// Here I would like to reach the derived classes from "fn" somehow and use it like "new Derived1"
//decltype(fn)::result_type ----------> this gives me Base only but i want the derived as well
}
}
2条答案
按热度按时间mzsu5hc01#
fn
的类型是std::function<Base()>
,因此调用fn()
的结果总是Base
。std::function
Package 的lambdas表达式返回其他类型并不重要。这些返回值用于初始化Base
类型的对象。记住,在C++中,多态性只适用于引用和指针。虽然
Base&
或Base*
可以引用Derived1
对象,但Base
对象不引用任何东西。它是一个Base
对象,永远不会是其他任何东西。如果你想要多态性,你需要你的函数返回指针:
au9on6nz2#
我设法用两种不同的方法解决了这个问题。
第一种方法:
第二种方法: