2016-11-02 7 views
0

Скажем, я хочу иметь функцию, как:Как получить набор параметров шаблона целых чисел int a function?

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() разрешен к reset<>(std::integer_sequence<size_t>), а не reset<0,1,2,3,4>(std::integer_sequence<size_t,0,1,2,3,4>). Я использую последнюю версию снимка 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(); 
}