2012-11-25 51 views
13

我一直在Google上尋找答案,試圖找到答案,但我不能用正確的術語搜索,因爲我找不到任何人在討論這種行爲。我試圖找出模板化函數的部分說明是否是C++標準的一部分,或者這是否是編譯器特定的。C++中的部分模板函數規範可行,但爲什麼?

通過部分指定,我的意思是隻指定編譯器無法推斷的類型。所以,如果我有一個模板函數「F」這需要3種類型,一個是在參數使用,可以推斷,我可以稱之爲「F」與形式f<type, type>(parameter)

下面是一個例子:

#include <iostream> 
#include <tuple> 
#include <string> 

template<class A, class B, class C> 
std::tuple<A, B> test(C c) 
{ 
    // do something based on c, return tuple with types A and B 
    return std::make_tuple(A(), B()); 
} 

int main(void) 
{ 
    // I expected I would have to use this form. Specify all parameters. 
    std::tuple<int, int> value3 = test<int, int, int>(5); 

    // Here, I only specified the return value types, did not specify the parameter type, yet it compiles. 
    auto value1 = test<int, int>("c-string"); 

    // Similar example here. Return types specified, parameter type deduced. Compiles fine. 
    auto value2 = test<std::string, int>(42); 

    return 0; 
} 

我用g ++ 4.5.3,g ++ 4.6.3,VS2010和VS2012測試了這個。由於它似乎得到了編譯器的廣泛支持,我敢打賭它是標準的一部分,但任何人都可以證實?有沒有人有任何鏈接或指向資源,可以解釋爲什麼這可以工作?

謝謝

+0

你還沒有解釋爲什麼你認爲這不應該工作。這裏沒有任何問題。無論如何,你在談論爭論推理,這當然不是新的。 –

+0

看起來像你在尋找這個:http://cpp0x.centaur.ath.cx/temp.deduct.call.html – yonilevy

+0

是的,這就是它yonilevy。謝謝。 –

回答

14

款的C++ 03標準規定

「尾隨,可以推導出(14.8.2)模板參數,可以從明確的模板參數列表省略14.8.1.2 「。

+0

這是我正在尋找的確認,謝謝。 –

+0

在這個問題上添加扭曲:是否沒有辦法推斷參數列表中間的模板參數,如果它們*可以從前面的參數中推導出來,但是必須明確指定後面的參數? – haelix

+0

我的意思就像在OP的代碼中,但如果函數聲明爲'template std :: tuple test(C c)' - 可能寫了'test (3.14)' – haelix