2015-10-13 69 views
2

我開始用C++ 11可變參數模板,我不知道,如果它可以創建一個結構/類的方法,從一個模板參數得名C++通用模板方法名

喜歡的東西:

MySmartTemplate<"foo", int, "bar", double> MyStruct; 

// which should result in: 
struct MyStruct 
{ 
    void foo(int val){...} 
    void bar(double val){...} 
}; 

在模板參數可能來配對作爲<名> + <型>

感謝

+1

不,但可以使用預處理器宏。 – CoffeeandCode

+3

簡而言之,答案是否定的,這是不可能的,反正不是。 –

回答

2

模板根本不可能。 C++中的模板通過一個或多個模板參數列表進行參數化。它們中的每一個可以是:

  • 非類型模板參數;
  • 一個類型模板參數;
  • 模板模板參數。

現在,爲了能夠(理論上)建立類似void foo(int val){...},你需要通過「富」的名字和它的參數類型到我們想象的模板。雖然傳遞val類型不成問題,但傳遞「foo」的名字是不可能的。您可以使用的唯一非模板參數是:

  • std :: nullptr_t;
  • 整型;
  • 左值引用類型(對象或函數);
  • 指針類型(對象或函數);
  • 指向成員類型(指向成員對象或成員函數)的指針;
  • 枚舉類型。

你還應該注意,參考和指針類型的非類型模板參數有少數例外,即它們不能引用或者是一個字符串的地址(相關:this question)。考慮到上述情況,無法將字符串文字傳遞給模板,因此無法通過模板實現您想要的內容。

另一方面,雖然可變參數模板是語言的一個很好的補充,但它們有一些限制,即只能執行參數包的擴展,但不能解決包中的各個參數。

因此,總結,不,你想要的是模板不可能的。

+0

...好的,那不太好。如果函數「名稱」將被索引替換,如元組< ... > get(i)? –

+0

@xy,以及你可以在地圖中存儲函數指針,並通過作爲模板參數傳遞的索引從那裏獲取它們,但是我看不出爲什麼你需要爲此使用模板。 – SingerOfTheFall

+0

除了添加/刪除一些模板參數 - 它是關於排序。假設模板參數的順序很重要,所以參數包中第一個的順序與其他順序不同... –

1

不幸的是沒有。模板機制只允許您使用類型的通用性,也就是創建可以使用多種類型的函數/對象,或者針對不同的輸入類型具有稍微不同的實現,或者根據模板參數等形成返回類型。通常,模板元編程引入了所謂的靜態多態性。這是一個compiler階段的功能(檢出compilation stages),這意味着它是在所有名稱都固定後完成的(即使編譯器決定將其與int參數一起使用,功能foo()也將始終被調用爲foo)。

你試圖實現的是進入proprocessor階段,其中可以使用preprocessor directives修改源代碼。這是你可以使用宏來玩的時刻。爲了您例如,你可以使用這樣的事情:

#include <iostream> 

using namespace std; 

#define MySmartTemplate(StructName, Func1Name, Func1ArgType, Func2Name, Func2ArgType) \ 
struct StructName \ 
{ \ 
    void Func1Name(Func1ArgType val) { cout << "func1" << endl; } \ 
    void Func2Name(Func2ArgType val) { cout << "func2" << endl; } \ 
}; 

MySmartTemplate(MyStruct, foo, int, bar, double); 

int main() 
{ 
    MyStruct myStruct; 
    myStruct.foo(1); 
    myStruct.bar(1); 
} 

Live demo


當然,你可以使用宏與模板,這將讓您有更多的靈活性。

+0

「模板機制只允許您在類型通用性方面獲得樂趣,即創建函數/對象可以使用多種**類型**「。所以如果我將不同的_function指針作爲模板參數傳遞,它會 - 很好地 - 模擬我的想法...,我會看看,但謝謝澄清... –