1

我有一个全局结构

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

FLOAT 可以是“double”或“int”

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

4

3 回答 3

0

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

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

在运行时,当您可能知道您的程序使用的是 adouble还是 a float(我希望!)时,您会弄清楚,然后执行Program's 的那个版本,这是您的d 程序static void main()的主要入口点。template

现在,并不是所有的东西都可以存在于 thisProgram template中,因为你可以在一个类中而不是在它之外做不同的事情:重点Program是在一个地方复制主代码流和你的“全局状态”。

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

如果你能分离出你Program真正需要知道的部分Float是什么,这可以为你省去很多悲伤。我只会为一个相对简单的程序这样做。

于 2013-06-26T15:42:36.487 回答
0

另一种选择是使用联合。联合将允许将相同的内存用作 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 个字节。

于 2013-06-26T15:48:32.003 回答
0

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

如果您需要在运行时确定类型,那么我建议您将每个属性boost::variant<int, double>改为 a。

于 2013-06-26T15:38:12.547 回答