C ++在编译时知道给定类型的对象数

时间:2017-03-17 11:31:58

标签: c++ arrays compile-time

我想注册给定类的所有对象,以便稍后我可以使用迭代它们的静态方法。我想出了下面的解决方案。我的想法是,我会将这个课程提供给与我合作的其他人,他们将派出课程来设计自己的模块。但是,我不得不将指针数组初始化为一个大尺寸,因为我不知道究竟会创建多少个这样的对象。有没有办法在编译时找出创建的对象数量(如果它们都是静态声明的那样?)

class Module {

    static Module* module_list[];
    static int count;

public:
    Module(string str){
        id = count;
        name = str;
        module_list[count++] = this;
    }

    static void printModules(){
        for(int i = 0; i < count; i++)
            cout << module_list[i]->name << endl;
    }

    int id;
    string name;
};

Module* Module::module_list[256];
int Module::count = 0;

Module x("module x"), y("module y");

int main(){
    Module::printModules();
}

注意:我最初的目标是在编译时自己创建列表,但是,我不知道如何做到这一点。欢迎提出建议。

1 个答案:

答案 0 :(得分:2)

  

有没有办法在编译时找出创建的对象数量(如果它们都是静态声明的话)?

不是真的,因为对象可能在单独的翻译单元中实例化。即使它们不是,但目前还没有反映特定翻译单元的方法,并且在C ++ 中寻找特定对象的所有实例化(除非你想使用外部的解析器+代码生成器解决方案)

  

但是,我必须将指针数组初始化为一个大尺寸,因为我不确切知道将创建多少这些对象。

只需使用std::vector,即表示您不需要任何固定限制:

auto& getModuleList()
{
    static std::vector<Module*> result;
    return result;
}

class Module {        
public:
    Module(string str){
        id = count;
        name = str;
        getModuleList().emplace_back(this);
    }