2013-08-25 61 views
1

我想返回的std::tuple_cat從我的函數的結果,但我無法推斷返回類型獲得連接的元組類型;結合的result_of和tuple_cat

#include <tuple> 

struct H { 
    typedef std::tuple<int,int> tuple_type; 
    tuple_type a {1,2}; 
}; 

template <typename tuple_holder_type, typename B> 
??? 
func(tuple_holder_type h, B b) { 
    return std::tuple_cat(h.a,std::make_tuple(b)); 
} 

int main(int argc, char const *argv[]) { 
    auto h = H(); 
    auto b = 3; 
    auto c = func(h,b); 
    return 0; 
} 

我試圖結合std::result_ofstd::tuple_cat這樣

typename std::result_of<std::tuple_cat(tuple_holder_type::tuple_type,std::tuple<B>) >::type 

但只有錯誤信息

test.cpp:9:85: error: template argument 1 is invalid 
test.cpp:9:86: error: expected identifier before '::' token 
test.cpp:10:1: error: expected initializer before 'func' 

問題:我該怎麼辦把問號,而不是爲這個工作

獎金問:爲什麼它的工作原理

編輯 忘了提,我需要這樣我就可以把結果類型的typedef,導致東西像

template <typename tuple_holder_type, typename B> 
struct tuple_appender { 
    typedef ??? return_type; 
    return_type operator() /*...*/ 
} 

謝謝:)

回答

5

在C++ 11可以使用decltype這樣的:

template <typename tuple_holder_type, typename B> 
auto 
func(tuple_holder_type h, B b) 
    -> decltype(std::tuple_cat(h.a,std::make_tuple(b))) 
{ 
    return std::tuple_cat(h.a,std::make_tuple(b)); 
} 

在C++ 1Y工作草案,你可以刪除decltype這樣的:

template <typename tuple_holder_type, typename B> 
auto 
func(tuple_holder_type h, B b) 
{ 
    return std::tuple_cat(h.a,std::make_tuple(b)); 
} 

,這裏是你如何能得到的func返回類型,並把它放在一個typedef,無無論怎樣func的返回類型編碼:

template <typename tuple_holder_type, typename B> 
struct tuple_appender { 
    typedef decltype(func(std::declval<typename tuple_holder_type::tuple_type>(), 
          std::declval<std::tuple<B>>())) return_type; 
}; 

std::declval<T>()只是一種方式來獲得T類型的右值表達式withou t必須默認構造一個,如T()。您可能不希望假設T是默認可構造的。您還可以得到的Tdeclval<T&>()左值表達式,或者declval<const T&>()一個const左值表達式等

+0

謝謝你,但我不能在typedef使用這種'decltype',沒有辦法做到這一點? – Valerij

+0

我不完全瞭解您的評論。你是說你的編譯器不支持'decltype',你需要一個解決方法嗎? –

+0

最終'func'是一個成員函數,我想通過一個typedef揭露它的返回類型,檢查更新的問題,對不起 – Valerij