2012-02-24 136 views
10

讓我們asssume,我們有一個模板funcion:是否可以將函數模板作爲模板參數傳遞?

template<typename T1, typename T2, typename T3> 
T3 such_fun(T1 a, T2 b) { 
    // do something... 
} 

,現在我們想用它作爲另一個模板參數,例如像那

template<typename T1, template<typename, typename, typename> some_function> 
void big_fun(T1 a) { 
    // some code... 
    a = some_function<T1, T1, T1>(a, a); 
    // some code... 
} 

這可能嗎?

我知道,我可以使用與自定義()操作一個結構。我只是對功能很好奇。

編輯:

當我在寫這個問題,我的朋友發現的部分解決方案:

template<typename T1, T1 (*some_function)(T1, T1)> 
void big_fun(T1 a) { 
    // some code... 
    a = some_function(a, a); 
    // some code... 
} 

但還是 - 我很好奇,如果有可能沒有一個功能型的前一個物化呼叫。例如 - 我可能想要調用各種類型組合通過的模板:

template<typename T1, typename T2, template<typename, typename, typename> some_function> 
void big_fun(T1 a, T2 b) { 
    // some code... 
    a = some_function<T1, T1, T1>(a, a); 
    a = some_function<T1, T2, T1>(a, b); 
    b = some_function<T2, T2, T2>(b, b); 
    b = some_function<T2, T1, T2>(b, a); 
    // some code... 
} 

回答

8

不,這是不可能的。從14.3.3在N3337:

模板參數的模板的模板參數應是一個類模板或別名模板的 名稱,表示爲 ID-表達。當模板參數命名爲類模板時, 只有在將模板參數與相應參數匹配時纔會考慮主類模板;即使其參數列表與模板模板參數的 相匹配,也不會考慮部分 專業化。

第一款只提到類模板明確。我想這也是不值得的麻煩,因爲你可以做一些非常類似的功能或std::function作爲論點。

+1

我不明白你在說什麼的話.. -1,你能爲我們提供的是不流利的standarese的ilustration? – lurscher 2012-02-24 17:58:33

+0

@lurscher,因爲_you_不明白這是一個可怕的原因downvote。當量子物理學家談論量子物理學時,我不會低估它,因爲我不理解它。 – 2012-02-24 18:04:18

+0

@SethCarnegie,我不同意。我認爲這本身就是一個很好的理由。此外,答案也是錯誤的;問題想要做什麼是完全可能的,即使在C++ 03中也是如此。我認爲SO的問題與pmr的回答之間存在脫節,因此存在倒退。如果他改善了他的回答,我會非常樂意撤回它 – lurscher 2012-02-24 18:19:40

1

C++中的模板在編譯期間使用具體類型進行編譯。他們必須知道。

這說你可以通過該參數可以推斷出一個函數模板走得更遠一點與你的部分解決方案。請注意,這與使用具體類型顯式傳遞函數不同,您只需輸入less即可。

template<typename T> 
T square(T a, T b) 
{ 
    return a * b; 
} 

template<typename T, T (*some_function)(T, T)> 
T test(T a) 
{ 
    return square (a, a); 
} 

void main() 
{ 
    int a = test<int, square>(2); 
    float b = test<float, square>(2.2f); 
} 
+0

我真的沒有看到該代碼和「部分解決方案」代碼之間的區別。問題是,在這種方法中,不可能在不明確添加新模板參數的情況下使用各種類型的'some_function'。我很好奇,如果有更靈活的(但仍然沒有類的使用)的方式。 – 2012-02-24 18:51:06

0

只要template< typename T1, typename T2, typename T3> someTemplate評估一些實際的類沒有錯誤,你可以根據需要,並內其他模板儘可能多的組合使用。

你試過編譯它嗎?讓我們看看你得到了什麼錯誤(和混凝土樣品)

+0

我知道我可以使用一個班級。我在我的文章中寫道。問題是關於常見的功能。但根據@pmr寫道 - 看起來語法上不可能。 – 2012-02-24 18:45:26

+0

@pmr嗯。好。我在示例中使用的語法部分是僞代碼,即我知道我不能使用'class'關鍵字,所以我沒有使用任何。這是關於這個想法。 – 2012-02-25 08:30:16

相關問題