我在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]);
答案 0 :(得分:1)
当你将一个变量放入一个异构容器时,它的类型已经消失,永远不会再回来了。您可以尝试重建它的类型并根据它应用不同的操作,但是您将永远无法使用初始类型或返回该类型的函数声明变量,而不能使用当前的C ++标准。
以下是一些糟糕的方法,可以在不改变设计的情况下继续进行:
每当您在pressures
中存储值时,将其typeid
存储在相应的向量中,然后在处理压力向量时启用typeid
以应用正确的操作。
...或者,如果您不想要额外的向量,则可以使用boost::any
中的any_cast
集合中的类型信息,直到找到正确的向量。
你必须将switch语句放入一个块中,为每种情况做一些标准事情(比如打印一些东西,返回一个字符串,......)。请注意,这两种方法都需要您知道可能类型的池;这使boost::variant
成为更好的候选人。 所以我的实际建议是检查设计:在容器中存储不同的boost::any
很少是一个好主意。