Получение значений сохраненного кортежа с помощью автоматического C++

Если я храню кортеж в классе как таковой:

class BaseA { } //So that I can store A in a class

template <typename Args...>
class A : public BaseA {
public:
    //I'm omitting the constructors
private:
    std::tuple<Args...> storedTup;
}

Сможете ли вы получить значения позже, выполнив что-то в этом роде?

//Change BaseA
class BaseA {
public:
    virtual ~BaseA(){}
    auto returnTuple();
}

//Change A
template <typename Args...>
class A : public BaseA {
public:
    auto returnTuple() -> decltype(storedTup) {
        return storedTup;
    }
private:
    std::tuple<Args...> storedTup;
}

Я понимаю, что это не работает, но есть ли простое решение, которое я упускаю из виду. Из того, что я видел, decltype может использовать члены, переданные через функцию (в моем случае returnTuple), но поскольку мой кортеж уже сохранен, это не очень поможет. Есть ли другой способ сделать тип автоматического возврата типом кортежа?


person TrevorPeyton    schedule 21.01.2015    source источник
comment
Что такое BaseA::returnTuple()?   -  person Barry    schedule 21.01.2015
comment
@Barry Вы не можете сохранить переменную шаблона, поэтому у вас есть класс A, сохраненный как BaseA. Это может помочь тому, что я говорю. stackoverflow.com/questions/569073/   -  person TrevorPeyton    schedule 21.01.2015


Ответы (1)


Поскольку returnTuple() должен иметь универсальный тип возврата, нет, вы не можете этого сделать. Вам нужно будет придумать какой-то способ выразить кортеж единым образом, возможно, полиморфным типом или вектором размеченных объединений и т. д.

person John Zwinck    schedule 21.01.2015
comment
Даже с авто в С++ 14? Я думал, что читал, что это то, что они добавили. Я найду статью, ждите. en.wikipedia.org/wiki/C%2B%2B14#Function_return_type_deduction - person TrevorPeyton; 21.01.2015
comment
@TrevorPeyton: Да, вы можете определить тип возвращаемого значения. Но это должен быть один тип. Какой тип auto будет разрешен в BaseA::returnTuple()? - person John Zwinck; 21.01.2015
comment
std::tuple‹Args...›. Если бы вы знали аргументы, можно было бы вернуть: std::tuple‹int, float›. Это то, что сделал бы auto, особенно если бы я мог определить его с помощью decltype. --- Извините, это должно быть переопределено А. - person TrevorPeyton; 21.01.2015
comment
Но BaseA не имеет и не знает о Args.... Итак, у вас есть противоречие, невозможность. - person John Zwinck; 21.01.2015
comment
Хорошо, если auto означает, что компилятор находит тип, я полагал, что компилятор может вывести этот тип. Хотя это было просто предположение. - person TrevorPeyton; 21.01.2015
comment
Да, нужно найти тип. Что такое единственный, единственный, никогда не изменяющийся тип возвращаемого значения в базовом классе? Подсказка: его нет, он известен только производному классу. Другими словами, C++11 auto не является boost::any. - person John Zwinck; 21.01.2015
comment
Давайте продолжим обсуждение в чате. - person TrevorPeyton; 21.01.2015