2012-07-26 116 views
2

我知道std :: get被重載。而且我知道要提取超載,我需要將其轉換爲特定的簽名。假設我需要一個指向std :: get的指針,它返回來自std :: tuple &的第一個元素的非const引用。下面是我的許多嘗試之一(不編譯):如何獲得指向std :: get <0,元組<int,int>>)的指針?

auto f = static_cast< 
    int& (*)(std::tuple<int,int>&) noexcept 
>(
    &std::get<(size_t)0u, std::tuple<int,int>> 
); 

我該如何指定此static_cast?

回答

7

元組獲取的簽名(直接的libstdC++拍攝):

template<std::size_t __i, typename... _Elements> 
    constexpr typename __add_ref<  
         typename tuple_element<__i, tuple<_Elements...>>::type 
        >::type 
    get(tuple<_Elements...>& __t) noexcept 

這樣的模板參數得到的是不同類型的元組,而不是元組,這樣的功能你把地址從應該是:

&std::get<(size_t)0u,int,int> 
+0

我回答了[類似的問題(http://stackoverflow.com/q/7157210/20984)大約一年以前,關於'boost :: get'。即使我很高興看到由於variadic模板,std :: tuple的實現更爲簡單,但我希望我們可以有一種方法來獲得std :: tuple的類型,而不是必須明確地重複它們。通過'boost :: tuple'我們可以通過嵌套的typedefs來訪問它們,但是這對於'std :: tuple'來說是不可能的,我們需要依靠一箇中間模板來推斷參數。如果我們只能輸入模板參數包... – 2012-07-26 13:18:08

+0

@LucTouraille:C++ 11不包含元編程容器和像boost這樣的算法,因爲它不具備提供類型的能力。然而,有一些輔助元函數可以在元組類型(tuple_cat,tuple_element,tuple_size)上操作,並且還有你自己的函數的能力,這些元組也可以使用可變參數模板,我認爲當前的解決方案需要大約相同數量的努力,只是一種完全不同的思維方式。 – PlasmaHH 2012-07-26 13:34:03

+0

當然,你總是可以使用一些間接的方法來推斷參數。例如,在這種情況下,我們可以編寫一個通用函數來獲取正確的'get'版本,但不指定所有參數,但恕我直言,這是一個更多的工作,即使可能有點乾淨(使用中間函數比訪問嵌套typedefs更靈活,例如,我們可以爲'std ::'和'boost ::''tuples'創建重載)。 – 2012-07-26 13:48:43

3

你需要一個指向一個實際的std :: get或任何具有相同行爲的函數的指針嗎?如果是的話你可以把它包裝在一個lambda:

auto f = [](std::tuple<int,int>& tuple) -> int& 
{ 
    return std::get<0>(tuple); 
} 
相關問題