2016-11-02 69 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(); 
} 
相关问题