2012-02-20 104 views
0

我有多種格式類型,每種類型都有一個名稱和一個賦值給它們的值。我希望能夠將格式類型作爲參數傳遞給方法。聲明看起來像CreateFile(4,3,2,UGS12_FMT),其中UGS12_FMT是一個C++類型。C++:使用類類型作爲參數

請注意,我沒有傳入實例作爲參數。有關如何完成此任務的任何建議?

回答

0

可能有很多方法來做到這一點。第一種方法是最值得推薦的方法,就是從共同父類繼承每個類,因爲它們共享「名稱」和「值」,如前所述。

如果你真的需要知道它是在功能「的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 ... 
0

你想看什麼是RTTI。支持因編譯器而異,但基本功能在那裏。一個好地方開始here

請注意,例如對於GCC,您需要幫助程序函數來取消type_info對象的名稱。

編輯:當然,確保模板不能提供你想要的東西,這將是首選的方式。

+2

我看不出RTTI如何適合這裏。 – jweyrich 2012-02-20 03:18:17

+0

*如果*你不能使用模板,並且你需要做一些最終取決於類型的事情,那麼可以使用RTTI信息(通常在type_info的映射中起作用)來有條件地執行操作。這避免了編寫一個可能很長且不那麼可維護的枚舉的需要。 – 2012-02-20 05:44:23

+0

我們不知道OP有多少文件類型正在考慮,但是如果他要編寫代碼來處理其中的每一個文件類型,那麼維護'enum'和'struct'是最簡單的任務。除此之外,'std :: type_info :: name()'在編譯器中是不一致的,因此,如果考慮可移植性,我將它看作主要的con。 – jweyrich 2012-02-20 06:01:00

1

你不能在typename傳遞作爲一個正常的函數參數,即你的片斷

using UGS12_FMT = some_type; 
auto file = CreateFile(4,3,2,UGS12_FMT); // error 

不會有任何效果(當你CreateFile宏,這是strongly discouraged除外)。

相反,您可以基本上使用三種替代技術之一。

  1. 超載取空類型的不同參數的函數(所謂的標籤分派):

    // 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 
    
  2. 使用一個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 
    
  3. 使用enum類型傳遞信息。

    enum struct format { 
        f1,    // indicates Format1 
        f2 };    // indicates Format2 
    file_type CreateFile(args,format); 
    
    auto file = CreateFile(4,3,2,format::f1); 
    

最後,你可以結合使用traits類作爲類似的技術,這些不同的方法。

相關問題