C++ 有没有办法记住(存储)decltype的返回类型?
我将函数调用的返回值存储在std::vector中,如下所示: 这是一个非常粗略的估计C++ 有没有办法记住(存储)decltype的返回类型?,c++,c++11,auto,decltype,boost-any,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(printerObs
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.
std::矢量压力;
打印机打印机BS1;
打印机打印机BS2;
常数int初始压力=1;
自动压力=MakeSubject(
binderobserver(printerObs1、printerObs2),初始压力//返回型压力如果我通过三个观察者,返回型将是压力等等
压力。推回(压力);//这忘记了类型。
如果压力仍然在范围内,我可以很容易地说:
decltype(pressure) *p = boost::any_cast<decltype(pressure)>(&pressures[0]);
p->Change(1999); //class Pressure has a function called Change.
decltype(压力)*p=boost::任何铸造(&pressures[0]);
p->Change(1999年)//类压力有一个称为“更改”的函数。
问题是,我如何记住存储在汽车中的汽车类型
std::vector<boost::any>
std::vector
??好吧,decltype甚至不返回可以存储的值
所以我需要一个可以存储boost::any的容器,记住它是decltype,这样我就可以说(这不起作用,但这是我努力实现的本质)
decltype(压力[0])*p=boost::任意铸造(压力[0]);
当您将变量放入异构容器时,它的类型将消失,并且永远不会回来。您可以尝试重构它的类型,并根据它应用不同的操作,但是您将无法声明具有初始类型或返回该类型的函数的变量,而不是用当前C++标准声明。
以下是一些在不改变设计的情况下进行操作的糟糕方法:
pressures
中,将其typeid
存储在相应的向量中,然后打开typeid
以在处理压力向量时应用正确的操作any\u cast
利用存储在boost::any
中的类型信息,直到找到正确的向量您必须将switch语句放入一个块中,该块对每种情况都执行一些标准操作(如打印某些内容、返回字符串等)。请注意,这两种方法都要求您了解可能的类型池;这使得
boost::variant
成为更好的候选者所以我的实际建议是审查设计:在容器中存储不同的boost::any
很少是一个好主意。始终记住存储的类型,如果这是您试图询问的。。。如果没有,请澄清你的问题。真的吗?如何获取它?成员type
为您提供std::typeinfo
decltype
用于获取表达式的类型。这是一个纯编译时构造typeid
用于获取与类型相对应的std::typeinfo
,该类型实际上在运行时仍然存在。所以现在我想你要做完整的动态输入。但是C++是静态类型的!重复数据消除程序已经指出,decltype
纯粹是编译时<代码>decltype()*p=不能以任何方式依赖于
的动态类型,因为该动态类型在编译时不会也不能知道,只能在运行时知道。您不能让编译器将其存储在某个位置,然后再加载,因为存储和加载是运行时操作,而不是编译时操作。
decltype(pressures[0]) *p = boost::any_cast<decltype(pressures[0])>(&pressures[0]);