2015-01-21 3 views
0

Если хранить кортеж в классе, как, например:Получение значений хранимого кортежа с автоматическими 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), но так как мой кортеж уже сохранен, что не поможет. Был бы еще один способ сделать тип автоматического возврата для кортежа?

+2

Что такое 'BaseA :: returnTuple()'? – Barry

+0

@Barry Вы не можете сохранить переменную шаблона, чтобы у вас был класс A save as BaseA. Это может помочь, что я говорю. http://stackoverflow.com/questions/569073/c-stdmap-of-template-class-values ​​ – TrevorPeyton

ответ

3

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

+0

Даже с авто в C++ 14? Я думал, что прочитал, что это то, что они добавили. Я найду статью, держись. http://en.wikipedia.org/wiki/C%2B%2B14#Function_return_type_deduction – TrevorPeyton

+0

@TrevorPeyton: Да вы можете вывести тип возврата. Но это должен быть один тип. Какой тип 'auto' будет разрешен в' BaseA :: returnTuple() '? –

+0

std :: tuple . Если бы вы знали аргументы, можно было бы вернуться: std :: tuple . Это то, что авто будет делать, особенно если бы я мог определить его с помощью decltype. --- Извините, это должно быть отменено A. – TrevorPeyton