簡體   English   中英

C ++使用靜態關鍵字或索引模板處理許多派生類

[英]C++ handling many derived classes with static keyword or indexed templates

我的意圖是,每當我添加一個新的派生類時,都需要將其注冊在某個其他類對象的類名列表中,以便所有新添加的類都可以用於一個進程。 但是,這樣做而無需手動編寫其他類的東西會花費更多時間。

我有很多派生類要維護,例如將它們添加到列表,檢查其名稱和類似內容。 現在我要使其自動化。 我能想到的是

  • 每個派生類都包含一個靜態成員初始化器,該初始化器還將其自己的名稱添加到基類的靜態列表中,以便程序調度程序解析該列表並處理准備工作。
  • 查看包含具有相同命名方案的源文件(派生類的類定義)的文件夾,並從中建立一個列表(再次使用名稱)
  • 讓每個派生類擁有一個屬於模板類型的數字,並在基類中對其進行迭代,直到給出錯誤為止

所有這些可能都不適合生產,或者至少可能並非一直都無法正常工作,例如,除非一次使用了一個類,否則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 { /* ... */ };

並保存具有Base引用的MyClass實例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM