[英]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.