C++ constexpr计数构造函数调用

bar*_*-md 7 c++ instantiation constexpr

我正在尝试在编译时静态实例化一些对象.我需要的是设置成员int变量增量值.例如,我创建的第一个对象将具有0值,第二个1,第三个2 ...总结我需要这样的东西,但它必须作为constexpr工作.

//header
class MyClass final {
private:
    static int IDcount;
public:
    const int ID;
    constexpr MyClass(args);
    //~MyClass();
};
//source
int MyClass::IDcount = 0;
constexpr MyClass::MyClass(args) : ID(MyClass::IDcount++) {
}
Run Code Online (Sandbox Code Playgroud)

有没有办法在编译时实现这一点(不将ID作为构造函数的参数)

Edw*_*ard 4

它不能按照您定义的方式完成,但是可以使用一种非标准但广泛实施的预处理器技巧。

#include <iostream>

struct MyClass final {
    constexpr MyClass(int myid, const char *myname)
        : id(myid), name(myname) {}
    int id;
    const char *name;
};

constexpr MyClass m[]{ 
    MyClass(__COUNTER__, "Larry"),
    MyClass(__COUNTER__, "Moe"),
    MyClass(__COUNTER__, "Curly")
};

int main()
{
    for (auto const &obj : m)
        std::cout << obj.id << '\t' << obj.name << "\n";
}
Run Code Online (Sandbox Code Playgroud)

该宏在Microsoft 的 Visual C++gcc 自版本 4.3clang__COUNTER__中定义。

运行时,该程序会产生:

0   Larry
1   Moe
2   Curly
Run Code Online (Sandbox Code Playgroud)