C++ 如何初始化静态成员而不重复其类型

C++ 如何初始化静态成员而不重复其类型,c++,c++11,C++,C++11,假设我们有以下课程: class A { static SomeLongType b; }; 现在我们必须在适当的cpp文件中初始化它。我可以想出以下方法: SomeLongType A::b{}; // repetition of SomeLongType decltype(A::b) A::b{}; // A::b written two times 这两个对我来说都有点麻烦。有更好的方法吗?完美的解决方案是使用C++11auto。但正如ecatmur评论的那样,这是语言所不允许

假设我们有以下课程:

class A {
    static SomeLongType b;
};
现在我们必须在适当的cpp文件中初始化它。我可以想出以下方法:

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

这两个对我来说都有点麻烦。有更好的方法吗?

完美的解决方案是使用C++11
auto
。但正如ecatmur评论的那样,这是语言所不允许的

为什么不定义一个简单的宏呢

#define DEFINE(x) decltype(x) x{}

struct A
{
    static SomeLongType b;
};

DEFINE( A::b );

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

只是吹毛求疵:你错过了
A
班上的
public::
)如果该类型是整数或枚举类型,则可以在类声明中对其进行初始化(在C++11中)。否则,不需要,您必须在实现中对其进行初始化(很像在类声明中未实现的成员函数)。尝试使用带有静态变量类型的模板类作为参数。最好使用
auto
,但请参见@herohuyongtao Nope,b可以是私有的。但是
static
变量需要一个定义。为了获得额外的分数,您可以使用更复杂的构造函数。不确定该语法的可移植性如何,尽管…@XavierHolt:Variatic宏在c++11中是允许的。@XavierHolt或只是将宏定义为
#define(x)decltype(x)x
,将其用作
define(A::b)
,或
定义(A::b){some params here},或
定义(A::b)=某物。我认为它比define(X,params…)更清晰
define(A::b,p1,p2,p3等)
,而且它不那么复杂,也更灵活。