我有多種格式類型,每種類型都有一個名稱和一個賦值給它們的值。我希望能夠將格式類型作爲參數傳遞給方法。聲明看起來像CreateFile(4,3,2,UGS12_FMT)
,其中UGS12_FMT
是一個C++類型。C++:使用類類型作爲參數
請注意,我沒有傳入實例作爲參數。有關如何完成此任務的任何建議?
我有多種格式類型,每種類型都有一個名稱和一個賦值給它們的值。我希望能夠將格式類型作爲參數傳遞給方法。聲明看起來像CreateFile(4,3,2,UGS12_FMT)
,其中UGS12_FMT
是一個C++類型。C++:使用類類型作爲參數
請注意,我沒有傳入實例作爲參數。有關如何完成此任務的任何建議?
可能有很多方法來做到這一點。第一種方法是最值得推薦的方法,就是從共同父類繼承每個類,因爲它們共享「名稱」和「值」,如前所述。
如果你真的需要知道它是在功能「的CreateFile」什麼課,你最好改變實現的功能,使用多個功能,如
CreateFile(ClassA a)
CreateFile(ClassB a)
,而不是
CreateFile(Class x)
if x is an instance of ClassA
doSomething ...
else if x is an instance of ClassB
doSomething ...
你想看什麼是RTTI。支持因編譯器而異,但基本功能在那裏。一個好地方開始here。
請注意,例如對於GCC,您需要幫助程序函數來取消type_info
對象的名稱。
編輯:當然,確保模板不能提供你想要的東西,這將是首選的方式。
你不能在typename
傳遞作爲一個正常的函數參數,即你的片斷
using UGS12_FMT = some_type;
auto file = CreateFile(4,3,2,UGS12_FMT); // error
不會有任何效果(當你CreateFile
宏,這是strongly discouraged除外)。
相反,您可以基本上使用三種替代技術之一。
超載取空類型的不同參數的函數(所謂的標籤分派):
// declarations of tag types
struct format1 {} fmt1;
struct format2 {} fmt2; // etc
// overloaded file creation functions
file_type CreateFile(args, format1);
file_type CreateFile(args, format2);
// usage:
auto file = CreateFile(4,3,2,fmt1); // use format1
使用一個template
(和專門它爲不同的格式類型)
template<typename Format>
file_type CreateFile(args); // generic template, not implemented
template<> file_type CreateFile<Format1>(args); // one speciliasation
template<> file_type CreateFile<Format2>(args); // another speciliasation
auto file = CreateFile<Format1>(4,3,2); // usage
使用enum
類型傳遞信息。
enum struct format {
f1, // indicates Format1
f2 }; // indicates Format2
file_type CreateFile(args,format);
auto file = CreateFile(4,3,2,format::f1);
最後,你可以結合使用traits
類作爲類似的技術,這些不同的方法。
我看不出RTTI如何適合這裏。 – jweyrich 2012-02-20 03:18:17
*如果*你不能使用模板,並且你需要做一些最終取決於類型的事情,那麼可以使用RTTI信息(通常在type_info的映射中起作用)來有條件地執行操作。這避免了編寫一個可能很長且不那麼可維護的枚舉的需要。 – 2012-02-20 05:44:23
我們不知道OP有多少文件類型正在考慮,但是如果他要編寫代碼來處理其中的每一個文件類型,那麼維護'enum'和'struct'是最簡單的任務。除此之外,'std :: type_info :: name()'在編譯器中是不一致的,因此,如果考慮可移植性,我將它看作主要的con。 – jweyrich 2012-02-20 06:01:00