2012-02-06 143 views
2

http://www.boost.org/doc/libs/1_35_0/doc/html/boost/get_id405862.html爲什麼我們必須提供boost :: get的參數類型?

template<typename U, typename T1, typename T2, ..., typename TN> 
    U & get(variant<T1, T2, ..., TN> & operand); 

函數成功僅如果內容是指定類型的U

boost::get是模板函數嗎?

大多數情況下,當我們調用模板函數時,函數本身可以推導出參數類型,因此我們不必手動輸入類型。

爲什麼在這種情況下,我們必須手動提供類型?是否因爲模板函數無法推斷返回值的類型,所以我們必須爲返回類型提供類型?

boost::variant<int, std::string> my_first_variant; 

    my_first_variant = 10; 

    assert(boost::get<int>(my_first_variant) == 10) 
        ^
+2

「*這是因爲模板函數無法推斷返回值的類型,因此我們必須爲返回類型提供類型?*」是的,完全是 - 您回答了您自己的問題。 ; - ] – ildjarn 2012-02-06 19:39:47

回答

3

是因爲該模板函數沒有辦法推斷返回值的類型,所以我們要提供的返回類型的類型?

是的,在編譯時沒有辦法推導出包含的類型。請記住variant在運行時包含T1, T2, ..., TN之一。

2

你不能推導出函數的返回類型,所以這是你需要指定的剩餘模板參數。

還要注意的是模板是編譯時代碼生成器,而boost::variant持有任何的,在運行有所不同類型的特定集合。所以「自動檢索當前類型」是沒有意義的,因爲這不是一個靜態的概念。

換言之,您可以編譯靜態指令「讓我輸入U」,並且調用在運行時可能成功也可能不成功,這取決於當時變體的當前狀態。

相關問題