我有一个全局结构
template <class FLOAT>
struct Cstruct {
FLOAT var1;
FLOAT var2;
};
FLOAT 可以是“double”或“int”
我想声明一个全局 Cstruct 对象,但我不知道它在编译时是“double”还是“int”。有没有办法做到这一点?提前致谢。
我有一个全局结构
template <class FLOAT>
struct Cstruct {
FLOAT var1;
FLOAT var2;
};
FLOAT 可以是“double”或“int”
我想声明一个全局 Cstruct 对象,但我不知道它在编译时是“double”还是“int”。有没有办法做到这一点?提前致谢。
一种疯狂的方法是把你的整个程序变成一个大的template
.
在这个大template<class Float> struct Program { ... };
的 中,您使用static
函数的方法。
在运行时,当您可能知道您的程序使用的是 adouble
还是 a float
(我希望!)时,您会弄清楚,然后执行Program
's 的那个版本,这是您的d 程序static void main()
的主要入口点。template
现在,并不是所有的东西都可以存在于 thisProgram
template
中,因为你可以在一个类中而不是在它之外做不同的事情:重点Program
是在一个地方复制主代码流和你的“全局状态”。
Program
可以使用其他template
s,例如函数或特征或其他类似的static
数据集合。它甚至可以调用函数并根据所涉及的类型进行重载决策。
如果你能分离出你Program
真正需要知道的部分Float
是什么,这可以为你省去很多悲伤。我只会为一个相对简单的程序这样做。
另一种选择是使用联合。联合将允许将相同的内存用作 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 个字节。
您必须在编译时知道模板的类型。
如果您需要在运行时确定类型,那么我建议您将每个属性boost::variant<int, double>
改为 a。