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

时间:2015-02-22 22:21:25

标签: 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.

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

中的自动类型
std::vector<boost::any> 

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

所以我需要一个可以存储boost的容器::任何__and__记住它的decltype 以便我可以说(这不起作用但是它的本质是我想要实现的目标)

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

1 个答案:

答案 0 :(得分:1)

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

以下是一些糟糕的方法,可以在不改变设计的情况下继续进行:

  1. 每当您在pressures中存储值时,将其typeid存储在相应的向量中,然后在处理压力向量时启用typeid以应用正确的操作。

  2. ...或者,如果您不想要额外的向量,则可以使用boost::any中的any_cast集合中的类型信息,直到找到正确的向量。

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