Прошло некоторое время, когда я делал C++, но я не знаком с шаблонами.Итерация на кортеже ... снова
Недавно я попытался написать класс, который обертывает std::vector<std::tuple<Types...>>
. Этот класс должен иметь функции-члены, и мне действительно нужно иметь возможность перебирать над кортежем. На самом деле, если я могу печатать каждый элемент кортежа (в порядке), я мог бы делать все, что мне нужно.
Я нашел решение с использованием приведения, но я не уверен в этом, так как он основан на актере, который мне не очень нравится (плюс, когда я пытаюсь использовать static_cast
, он не компилируется больше).
Мой вопрос в том, является ли следующий код правильным, портативным, является ли это взломом, и должен ли я найти другой способ сделать это, чем использовать этот листинг? Кроме того, этот актер, вероятно, прав на исполнение во время выполнения? Есть ли способ сделать то, что я хочу без этого?
std::ostream& operator<<(std::ostream& out, std::tuple<> const& tuple)
{
return out; // Nothing to do here
}
template<typename First, typename... Types>
std::ostream& operator<<(std::ostream& out, std::tuple<First, Types...> const& tuple)
{
out << std::get<0>(tuple) << " ";
// The cast that I don't like
return out << (std::tuple<Types...>&) tuple;
}
int main()
{
auto tuple = std::make_tuple(1, 2.3, "Hello");
std::cout << tuple << std::endl;
return 0;
}
Заранее благодарю вас за ответы.
Этот тип выглядит как 'reinterpret_cast'. Так что нет, не хорошо. – 0x499602D2
Это даже [производит segfault] (http://coliru.stacked-crooked.com/a/9f96f1e786b070f1) при использовании clang ++ и libC++ – dyp
@dyp Это именно то, что я хотел знать, спасибо! – tforgione