c++ - 有没有办法记住(存储)decltype 的返回类型?

标签 c++ c++11 auto decltype boost-any

我将像这样的函数调用的返回值存储在 std::vector 中:

这是一个非常粗略的估计

std::vector<boost::any> pressures;

Printer printerObs1;
Printer printerObs2;

const int initialPressure = 1;

auto pressure = MakeSubject<Pressure>(
                    BindObservers(printerObs1, printerObs2), initialPressure);//Return type Pressure<Printer, Printer> if I had passed three observers, the return type would have been Pressure<Printer, Printer, Printer> and so on

pressures.push_back(pressure); // This forgets the type.

如果压力仍在范围内,我可以轻松地说:

decltype(pressure) *p = boost::any_cast<decltype(pressure)>(&pressures[0]);

p->Change(1999); //class Pressure has a function called Change.

问题是,我如何记住存储在

中的 auto 类型
std::vector<boost::any> 

? AFAIK,decltype 甚至不返回可以存储的值?

所以我需要一个可以存储 boost::any __and__ 的容器,记住它是 decltype 这样我就可以说(这不起作用,但这是我想要实现的本质)

decltype(pressures[0]) *p = boost::any_cast<decltype(pressures[0])>(&pressures[0]);

最佳答案

当你将一个变量放入一个异构容器中时,它的类型就消失了,永远不会回来。您可以尝试重建它的类型并根据它应用不同的操作,但您将永远无法声明具有初始类型的变量或返回该类型的函数,而不是当前的 C++ 标准。

这里有一些糟糕的方法可以在不改变设计的情况下继续:

  1. 每当您在 pressures 中存储值时, 存储它的 typeid在相应的 vector 中,然后打开 typeid在处理压力 vector 时应用正确的操作。

  2. ...或者,如果您不需要额外的 vector ,您可以利用存储在 boost::any 中的类型信息与一组 any_cast直到找到正确的为止。

你必须将 switch 语句放入一个 block 中,该 block 为每种情况做一些标准的事情(比如打印一些东西,返回一个字符串,......)。请注意,这两种方法都需要您了解可能类型的池;这使得 boost::variant一个更好的候选人。 所以我的实际建议是审查设计:存储不同的 boost::any在容器中很少是个好主意。

关于c++ - 有没有办法记住(存储)decltype 的返回类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28664005/

相关文章:

c++ - 如何在 C++ 中使用 switch 语句显示价格差异

c++ - 按值捕获 shared_ptr 的 lambda 如何影响它的 use_count()?

c++ - 在一个函数中嵌入不同的函数 : functor or lambda?

c++ - 如何遍历两对 STL set<pair<t1,t2>,pair<t1,t2>> 中的所有元素?

c++ - 简单的 C++ 程序无法在 Windows 上的 MingW 下链接

c++ - 集成库导致错误 C++

c++ - 如何在 STLport 库中使用 const auto

c++ - `auto` 类成员上下文中的返回类型

C++返回对临时的引用

c++ - Qt 连接到 std::function