C++ 在c+中为公共类变量声明两个或多个类型+;

C++ 在c+中为公共类变量声明两个或多个类型+;,c++,class,types,C++,Class,Types,注意:我使用的是C++11 假设我有一个类foo,带有公共变量bar,它可以是浮点或整数。bar的类型由赋值决定,如下所示: foo object_name; object_name.weight() = value 如果value是一个int,那么object\u name.weight()是一个int,如果value是一个float,那么object\u name.weight()是一个float 一种可能是将foo_i和foo_f两个类分别键入int和float,其中bar;但这相当不

注意:我使用的是C++11


假设我有一个类
foo
,带有公共变量
bar
,它可以是浮点或整数。
bar
的类型由赋值决定,如下所示:

foo object_name;
object_name.weight() = value
如果
value
是一个int,那么
object\u name.weight()
是一个int,如果
value
是一个float,那么
object\u name.weight()
是一个float

一种可能是将
foo_i
foo_f
两个类分别键入int和float,其中
bar
;但这相当不方便,尤其是当
foo_i
foo_f
基本上是彼此的克隆,它们之间只有类型差异时


有没有办法在单个类的范围内将
bar
的类型指定为
int
float

为了只编写一次类主体,您可以在
bar
的类型上模板类
foo
,然后使用两个typedef来简化后续的使用。例如:

template<typename TBar> class foo { 
    public: TBar bar; 
}; 

typedef foo<int> foo_i; 
typedef foo<float> foo_f;
模板类foo{
公众:TBar酒吧;
}; 
类型def foo foo_i;
类型def foo foof;

对于C++的新成员,注释是这样的,元编程技术将使编译器生成两个不同版本的同一类,即从生成的二进制的角度来看,相当于用“C++”17或更高版本来编写两个不同的类型,对于“代码> Bar < /代码>两个不同的类型。您可以使用@RSahu,我只有C++14及更早版本。到目前为止,我一直在使用C++11。我想到的最简单的方法是在条形图类型上模板类foo,即
模板类foo{public:TBar bar;}。这样,只需编写一次类主体,然后就可以使用
typedef foo foo\u i
typedef foo foo\u f
获取两个类。您可能需要滚动您的
std::variant
版本。这是一个有意义的抽象,您可以将其用于您的用例中。(我将把我的评论扩展为一个答案。)由于
foo_I
foo_f
没有声明,我可以只声明模板和类吗?@R.Burton,简短回答:通常是的。如果上面的代码位于标题中,并且使用foo_i和foo_f的客户端代码包含此标题,则可以将
foo_i
foo_f
别名视为自动被
foo
foo
替换。在这种情况下,编译器为这两种类型推出模板化的类主体,也就是说,您可以认为它们都在同一个头中声明。您唯一需要担心的是,如果客户端代码没有模板化类的完整代码
foo
。在这种情况下,您仍然需要向前声明模板类,并使该声明可用。但是,您可以将实现/定义(
{}
中的所有内容)隐藏在某个不可访问的头中(或者保护它不被
外部模板
声明实例化),然后在另一个源文件中显式地实例化模板。当您编写C++库并尝试减少客户端代码编译时,后一种方法是有意义的。有关更多信息,请参见
模板类…
外部模板类上的文档。