c ++中模板化的全局结构

时间:2013-06-26 15:32:08

标签: c++ templates global-variables

我有一个全球结构

template <class FLOAT>
struct Cstruct {
    FLOAT var1;
    FLOAT var2;
};

FLOAT可以是“double”或“int”

我想声明一个全局Cstruct对象,但我不知道在编译时它是“double”还是“int”。有没有办法实现这个?提前致谢。

3 个答案:

答案 0 :(得分:0)

编译时必须知道模板的类型。

如果你需要在运行时找出类型,那么我建议让每个属性改为boost::variant<int, double>

答案 1 :(得分:0)

一种疯狂的方法是将整个程序变成一个大的template

在这个较大的template<class Float> struct Program { ... };中,您可以使用static方法来处理函数。

在运行时,当您可能知道您的程序是使用double还是float时(我希望!),您可以解决这个问题,然后执行该版本的Program static void main()template d计划的主要入口点。

现在,并非所有内容都可以存在于此Program template中,因为您可以在一个类中执行与外部不同的操作:Program的重点是复制主要内容代码流和你的“全局状态”在一个地方。

Program可以使用其他template,例如函数或特征或其他类似的static数据集合。它甚至可以调用函数并根据所涉及的类型执行重载决策。

如果您可以隔离Program实际需要了解Float的内容的哪些部分,这可以为您带来更多的悲伤。我只是为一个相对简单的程序做这件事。

答案 2 :(得分:0)

另一种选择是使用联合。 union将允许将相同的内存用作int或double。

union DoubleOrInt
{
    double dValue;
    int iValue;
};

struct Cstruct
{
    DoubleOrInt var1;
    DoubleOrInt var2;
};

当您知道它需要的类型时,访问Cstruct中的内存:

Cstruct Test;
Test.var1.iValue = 1;
Test.var2.dValue = 2.0;

请注意,如果您最终使用整数而不是双精度(如果int和double变量的标准大小分别为4和8),则此方法将浪费每个联合4个字节。