作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我将像这样的函数调用的返回值存储在 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++ 标准。
这里有一些糟糕的方法可以在不改变设计的情况下继续:
每当您在 pressures
中存储值时, 存储它的 typeid
在相应的 vector 中,然后打开 typeid
在处理压力 vector 时应用正确的操作。
...或者,如果您不需要额外的 vector ,您可以利用存储在 boost::any
中的类型信息与一组 any_cast
直到找到正确的为止。
你必须将 switch 语句放入一个 block 中,该 block 为每种情况做一些标准的事情(比如打印一些东西,返回一个字符串,......)。请注意,这两种方法都需要您了解可能类型的池;这使得 boost::variant
一个更好的候选人。 所以我的实际建议是审查设计:存储不同的 boost::any
在容器中很少是个好主意。
关于c++ - 有没有办法记住(存储)decltype 的返回类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28664005/
我是一名优秀的程序员,十分优秀!