我正在尋找一種方法來確定在運行時應分配哪種類型的對象(基於給定的類名稱,其類型爲const char*
)。如何獲得給定類名稱的未知類的對象
嘛,當然最簡單的方法是使用if
S/else if
小號加載,但似乎不適用,因爲我有> 100個不同的類別(以及至少他們都來自同一個基類派生),我有定期增加新課程。
我已經想出了一個初稿,但遺憾的是它不編譯,但(MinGW的& G ++ 4.4)
template<typename TBase, typename TDerived, typename... TArgs>
Base* get_classobject(const char* classname)
{
if(strcmp(classname,typeid(TDerived).name())==0)
return new TDerived; //
else if(sizeof...(TArgs)>0)
return get_classobject<TBase,TArgs...>(classname);
else
return 0;
}
int main()
{
Base* obj = get_classobject<Base,A,Foo,B,C>("Foo");
// ^- Types A B C and Foo are all derived from Base
delete obj; //of course we got an virtual dtor ;)
return 0;
}
但試圖生成代碼sizeof...(TArgs)>0
犯規停止GCC爲get_classobject<TBase,const char*>(const char*)
從而未能
你有任何想法,如何解決這個問題,或任何其他想法? 謝謝。
編輯:我解決了這個問題:
template<typename TBase, typename TDerived>
Base* get_classobject(const char* classname)
{
if(strcmp(classname,typeid(TDerived).name())==0)
return new TDerived;
return 0;
}
template<typename TBase, typename TDerived, typename TArg, typename... TArgs>
Base* get_classobject(const char* classname)
{
if(strcmp(classname,typeid(TDerived).name())==0)
return new TDerived;
return get_classobject<TBase,TArg,TArgs...>(classname);
}
編輯感興趣的讀者:
您現在應該是執行上面沒有編譯器無關的。 typeif(sometype).name()
的輸出是編譯器/實現特定的。 在所有派生類中使用static const char* name
變量或函數,可以解決這個問題,但會添加一些工作(當然,您可以使用宏來實現此目的,但是如果您已經使用宏,則可以使用另一個對象工廠方法)
聞起來就像你需要實現一個工廠和'clone'方法。使用'clone()'接口,你可以創建一個家族的對象,而不需要知道他們的類名。 – 2010-01-16 01:04:17
我不想看起來很重要,但真的......這味道不好。首先,'typeid'的使用是頗有爭議的,但我也想指出這種方法的低效性>你執行一個線性複雜的搜索,並且你必須精確地確定所有可能生成的類型。 ..我甚至不想考慮噩夢般的維護成本。 – 2010-01-16 16:47:30
typeid可以很容易地用static :: name函數代替,線性搜索不是一個問題,因爲我只調用這個方法一次(除此之外,任何其他對象工廠ive看過也有一個線性搜索或濫用宏) – smerlin 2010-01-16 19:03:47