gpt4 book ai didi

C++ 使用静态关键字或索引模板处理许多派生类

转载 作者:行者123 更新时间:2023-11-28 05:05:11 24 4
gpt4 key购买 nike

我的意图是,每当我添加一个新的派生类时,我都需要将它注册到某个其他类对象的类名列表中,以便所有新添加的类都可以用于一个进程。但是,如果不手动向其他类编写额外的内容,这样做会花费更多时间。

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

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

所有这些可能都不适合生产,或者至少可能不会一直有效,例如,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 个派生类会怎样?

是否有 beyond static 关键字使类在程序启动时立即加载,即使没有前向声明或其他任何东西?

最佳答案

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

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 { /* ... */ };

并使用 Base 引用保存 MyClass 的实例。

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com