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

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中,如下所示:

这是一个非常粗略的估计

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]);