2

我将这样的函数调用的返回值存储在 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::any __and__ 的容器,记住它是 decltype以便我可以说(这不起作用,但这是我想要实现的本质)

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

1 回答 1

1

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

在不改变你的设计的情况下,这里有一些糟糕的方法:

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

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

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

于 2015-02-22T23:31:21.397 回答