2016-11-02 102 views
0

說我想有這樣一個功能:如何獲取函數中的整型模板參數包?

void reset() 
{ 
    (std::get</*pack of integers from 0 to 4*/>(someTuple).reset(), ...); 
} 

我與助手功能這樣做的:

template < size_t... Indexes > 
void reset(std::integer_sequence<size_t, Indexes...>) 
{ 
    (std::get<Indexes>(someTuple).reset(), ...); 
} 
void reset() 
{ 
    reset(std::make_integer_sequence<size_t,5>{}); 
} 

但我可以只用一個函數實現這一目標?嘗試這樣的:

template < size_t... Indexes > 
void reset(std::integer_sequence<size_t, Indexes...> = std::make_integer_sequence<size_t,5>{}) 
{ 
    (std::get<Indexes>(someTuple).reset(), ...); 
} 

失敗的決心reset<>(std::integer_sequence<size_t>)而不是reset<0,1,2,3,4>(std::integer_sequence<size_t,0,1,2,3,4>)通話reset()。我使用的最新快照GCC-7.0.0

+1

你有什麼是要走的路,國際海事組織 –

回答

1

可以實現這樣的事情被默認模板參數:

template <class S = std::make_index_sequence<5>> 
struct reset; // intentionally undefined 

template <size_t... Is> 
struct reset<std::index_sequence<Is...>> { 
    template <class Tuple> 
    static void impl(Tuple& t) { 
     (std::get<Is>(t).reset(), ...); 
    } 
}; 

reset<>::impl(someTuple); 

但不是在函數中(因爲這樣的事情需要功能模板的部分專業化,這是語言不支持的)。

相反,剛剛創建內嵌參數包拆包一個輔助拉姆達:

void reset() { 
    indexer<5>()([&](auto I){ 
     std::get<I>(someTuple).reset(); 
    }); 
} 
0

你可以使用通用的λ和一些輔助結構是這樣的:

#include <utility> 
#include <type_traits> 
#include <tuple> 

template <std::size_t N, class = std::make_index_sequence<N>> 
struct iterate; 

template <std::size_t N, std::size_t... Is> 
struct iterate<N, std::index_sequence<Is...>> { 
    template <class Lambda> 
    void operator()(Lambda lambda) { 
     lambda(std::integral_constant<std::size_t, Is>{}...); 
    } 
}; 

struct Foo { 
    void reset() {} 
}; 

void reset() { 
    std::tuple<Foo, Foo, Foo> bar; 
    iterate<std::tuple_size<decltype(bar)>::value>{}([&](auto... is) { 
     (std::get<is>(bar).reset(), ...); 
    }); 
} 

int main() { 
    reset(); 
} 
相關問題