如何初始化静态成员而不需要重复它们的类型?(注:这是一个提问标题,无需回答)

5

假设我们有以下类:

class A {
    static SomeLongType b;
};

现在我们需要在相应的cpp文件中对其进行初始化。我能想到以下几种方法:

SomeLongType A::b{}; // repetition of SomeLongType
decltype(A::b) A::b{}; // A::b written two times

对我来说,这两种方式都有点繁琐。有没有更好的方法呢?


只是吐槽一下:你在类“A”中漏掉了public::。 :) - herohuyongtao
如果类型是整数或枚举类型,则可以在类声明中初始化它(在C++11中)。否则,您必须在实现中初始化它(就像没有在类声明中实现的成员函数一样)。 - Zac Howland
尝试使用模板类,将静态变量类型作为参数。 - PiotrNycz
2
使用auto会很好,但请参考https://dev59.com/PGYq5IYBdhLWcg3wrihD?rq=1。 - ecatmur
1
@herohuyongtao 不,b可以是私有的。但是static变量需要一个定义。 - harper
由于您正在使用 decltype,我们可以假设您在使用 C++11 吗?我已经编辑了标签。 - John Dibling
1个回答

3
完美的解决方案是使用C++11的auto。但正如ecatmur所评论的那样,这在该语言中是不允许的。
为什么不只定义一个简单的宏呢?
#define DEFINE(x) decltype(x) x{}

struct A
{
    static SomeLongType b;
};

DEFINE( A::b );

我真的很讨厌C宏,但在某些情况下它们是有用的。


而且,如果你能将其制作成可变参数宏,以处理更复杂的构造函数,则可以获得额外的加分。不过,我不确定该语法的可移植性如何... - Xavier Holt
2
@XavierHolt:C++11允许使用可变参数宏。 - Alexandre C.
2
你可以将宏定义为 #define DEFINE(x) decltype(x) x,然后使用 DEFINE(A::b);DEFINE(A::b){ 一些参数 }; 或者 DEFINE(A::b) = something;。我认为这比 #define DEFINE(X , params...) DEFINE(A::b , p1 , p2 , p3, etc ) 更清晰,更灵活,也不容易出错。 - Manu343726

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接