我的意图是,每当我添加一个新的派生类时,我都需要将其注册在某个其他类对象的类名列表中,以便所有新添加的类都可用于一个进程。但是,这样做而无需手动编写其他类的东西会花费更多时间。

我有很多派生类要维护,例如将它们添加到列表,检查其名称和类似内容。现在我要使其自动化。我能想到的是


让每个派生类都包含一个静态成员初始化器,该初始化器还将自己的名称添加到基类的静态列表中,以便程序调度程序解析该列表并处理准备工作。
查看包含具有相同命名方案的源文件(派生类的类定义)的文件夹,并从中建立一个列表(再次使用名称)
让每个派生类拥有一个属于模板类型的数字,并在基类中对其进行迭代,直到给出错误为止


所有这些可能都不适合生产,或者至少可能并非一直都无法正常工作,例如,除非一次使用了一个类,否则static关键字不起作用,但是如果我不知道,则无法初始化类。第二种选择不安全,第三种我不知道当模板的整数索引超出边界时是否会使程序崩溃。

增加危险性

 // try until error, can compiler compile this?
 while(noError)
 {
     tryInit(new MyClass<ctr>()).addToList();
 }
 // or
 tryInit(new MyClass<2>()).addToList();
 tryInit(new MyClass<3>()).addToList();
 tryInit(new MyClass<4>()).addToList();
 tryInit(new MyClass<5>()).addToList();


如果没有5个派生类怎么办?

是否有一个超越静态的关键字,即使没有前向声明或其他任何东西,也可以在程序启动时立即加载类?

最佳答案

如果有些不安全/令人讨厌,您所描述的是可能的

template<int>
struct MyClass : std::false_type {};

template<>
struct MyClass<0> : std::true_type
{
    static void foo(int i) { std::cout << i << " is useful!" << std::endl; }
};

// and so on...


要添加新类,只需添加MyClass的另一种特殊化。

遍历所有这些

template<int n>
void foo_all_(int i)
{
    if constexpr(MyClass<n>::value)
    {
        MyClass<n>::foo(i);
        foo_all_<n + 1>(i);
    }
}

void foo_all(int i)
{
    foo_all_<0>(i);
}


不安全/令人讨厌的部分是所有MyClass必须适当地专门化和定义才能起作用。

我想拥有这样一个类家族仅对多态性有用,这可能会使它变得更友好

struct Base : std::true_type { /* ... */ };

template<int>
struct MyClass {};

template<>
struct MyClass<0> : Base { /* ... */ };


并保存带有MyClass引用的Base实例。

关于c++ - C++使用静态关键字或索引模板处理许多派生类,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45001406/

10-15 05:56