我有一个全球结构
template <class FLOAT>
struct Cstruct {
FLOAT var1;
FLOAT var2;
};
FLOAT可以是“double”或“int”
我想声明一个全局Cstruct对象,但我不知道在编译时它是“double”还是“int”。有没有办法实现这个?提前致谢。
答案 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个字节。