背景。 我繼承了一個大型系統,該系統利用模板來存盤關于類的元資料,這可能使這個問題中的一些固有假設產生了色彩。
我正在使用一個模板注冊系統,該系統部分地基于這里的一個答案。是否有一種方法可以從持有類名的字串中實體化物件?. 在我的系統中不能使用宏,也不能使用 boost(或任何第三方 API)。
問題。 我能否讓模板根據輸入型別是否是抽象的和具體的而有不同的行為?
我正在尋找類似這樣的東西(此處使用的代碼直接從鏈接問題中已接受的答案中復制):
我正在尋找類似這樣的東西。
struct BaseFactory {
typedef std::map<std::string, Base*(*)()> map_type;
static Base * createInstance(std::string const& s) {
map_type::iterator it = getMap()->find(s)。
if(it == getMap()->end()
return 0;
return it->second()。
}
protected:
static map_type * getMap() {
//永不洗掉。(存在到程式終止為止)
///因為我們不能保證正確的銷毀順序。
if(!map) { map = new map_type; }
return map。
}
private:
static map_type * map。
};
template<typename T>
struct DerivedRegister : BaseFactory {
DerivedRegister(std::string const& s) {
getMap()->insert(std::make_pair(s, & createT< T> ))。
}
};
// in derivedb.hpp
class DerivedB {
...;
private:
static DerivedRegister<DerivedB> reg;
};
// in derivedb.cpp:
DerivedRegister<DerivedB> DerivedB::reg("DerivedB"/span>)。
除此之外,我希望DerivedRegister能根據T是抽象的還是具體的而表現出不同的效果。在 T 是抽象的情況下,我希望 DerivedRegister 不向 map 注冊型別。
正如我在背景中提到的,我已經繼承了一個已經存在于類層次結構中的現有系統(抽象或具體)。修改這個現有的系統以添加地圖注冊是很簡單的;然而,抽象類造成了問題,因為在它們身上呼叫 new 是無效的。
在 BaseFactory 和 DerivedRegister 之間添加額外的繼承層和模板不會有什么問題;但是,DerivedRegister 已經存在于每個類上,我無法改變這一點。
我認識到,我可以直接添加一個獨立于現有模板類的獨特的注冊系統,只將其添加到具體的類中。我特別想問的是,在C 11中,是否有一種解決方案可以讓我在不使用第三方庫的情況下避免這種情況(我知道有很多限制...)。
uj5u.com熱心網友回復:
如果T是一個抽象類(即一個宣告或繼承了至少一個純虛函式的非聯合類),提供成員常量值等于
true。對于任何其他型別,值是false。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/314182.html
標籤:
上一篇:自我的靜態參考類
下一篇:不支持SQL查詢連接?
