Преобразование std :: tuple в std :: array в C ++ 11 приводит к сбою шаблона variadic

Следующая функция, toArray, может однажды конвертировать C ++ 11 std::tuple в C ++ 11 std::array:

#include <tuple>
#include <array>

template <typename T, typename ...U>
std::array<T,sizeof...(U)>
toArray(std::tuple<U...>) {
return std::array<T,sizeof...(U)>();
}

Если я попытаюсь позвонить toArray с помощью следующего кода под G ++ 4.8 я могу успешно скомпилировать. Однако при компиляции с Clang ++ 3.2 происходит сбой внешнего интерфейса Clang. Является ли мой код допустимым C ++?

int main(int argc, char *argv[])
{
auto tup = std::make_tuple(1,2,3,4,5,6,7,8);
toArray<int>(tup);
return 0;
}

3

Решение

Это выглядит актуально для меня, и готовая версия прекрасно работает с G ++:

#включают <Реди / index_tuple.h>
template <typename T, typename... U, unsigned... N>
std::array<T, sizeof...(U)>
toArray2(std::tuple<U...>& t, redi::index_tuple<N...>) {
return std::array<T, sizeof...(U)>{{ std::get<N>(t)... }};
}

template <typename T, typename ...U>
std::array<T, sizeof...(U)>
toArray(std::tuple<U...> t) {
return toArray2<T>(t, redi::to_index_tuple<U...>{});
}

int main()
{
auto tup = std::make_tuple(1,2,3,4,5,6,7,8);
return toArray<int>(tup)[3] - 4;
}
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]