Построить вариант c кортеж из массива для возврата - PullRequest
0 голосов
/ 09 июля 2020

Я хочу иметь метод для создания кортежа с номером переменной или записями на основе того, сколько записей имеет объект в контейнере переменных-членов (например, вектор). мой лучший результат. Однако не работает. Мне явно чего-то не хватает в построении возвращаемого значения. Допустим, m_values - это контейнер со значениями, которые я хочу поместить в кортеж и вернуть.

template<typename... T>
std::tuple<T...> getValuesTuple()
{
    if (m_values[0].isValid())
    {
        return buildReturnTuple(0);
    }
    return std::tuple<T...>();
}

template<typename... T>
std::tuple<T...> buildReturnTuple(size_t i)
{
    if (i + 1 < MAX_VALUES && m_values[i + 1].isValid())
    {
        return std::tuple<T, T...>(m_values[i], buildReturnTuple(i + 1));
    }

    return std::tuple<T...>(m_values[i]...);
}

Заранее спасибо!

Ответы [ 2 ]

2 голосов
/ 09 июля 2020

Если вы знаете размер массива во время компиляции, это можно сделать следующим образом:


#include <array>
#include <tuple>
#include <utility>

struct MyType {};

constexpr auto my_type_to_any_other_type(const MyType&) {
    // use if constexpr to return desired types
    return 0;
}

template<std::size_t N, std::size_t... Idx>
constexpr auto array_to_tuple_helper(const std::array<MyType, N>& a, std::index_sequence<Idx...>) {
    return std::make_tuple(my_type_to_any_other_type(a[Idx])...);
}

template<std::size_t N>
constexpr auto array_to_tuple(const std::array<MyType, N>& a) {
    return array_to_tuple_helper(a, std::make_index_sequence<N>{});
}

int main () {
    auto t = array_to_tuple(std::array<MyType, 1>{ MyType{} });
    return 0;
}
0 голосов
/ 09 июля 2020

Типы переменных в C ++ - это свойство времени компиляции.

Тип, возвращаемый функцией, является свойством времени компиляции.

То, что вы просите сделать, невозможно сделать, потому что Кортеж из 2 элементов - это другой тип, чем кортеж из 3 элементов.

Существуют связанные методы, основанные на std::variant или даже std::any, но они вряд ли будут тем, что вам нужно.

Вы нужно сделать шаг назад и взглянуть на вашу проблему, которая побудила вас сохранить данные в виде кортежа, и найти другой путь.

...