2015-11-20 5 views
0

Привет, я хотел реализовать кортеж. Позвольте мне знать, что в этом не так, и как правильно его реализовать. Я хочу вернуть три значения из функции, где первые значения будут целыми, а последним значением будет массив.возвращает три значения из функции

template <typename T1, typename T2, typename T3> 
struct t_untuple 
{ 
    T1& a1; 
    T2& a2; 
    T3& a3; 
    explicit t_untuple(T1& a1, T2& a2, T3& a3) : a1(a1), a2(a2), a3(a3) { } 

t_untuple<T1, T2, T3>& operator = (const tuple <T1, T2, T3>& p) 
    { 
     a1 = p.first; 
     a2 = p.second; 
     a3 = p.third; 
     return *this; 
    } 
}; 

// Our functor helper (creates it) 
template <typename T1, typename T2, typename T3> 
t_untuple<T1, T2, T3> unpair(T1& a1, T2& a2, T3& a3) 
{ 
    return t_unpair<T1, T2, T3>(a1, a2, a3); 
} 

Помогите мне в этом.

Я получаю символ «кортеж» не может быть решена на сопзЬ кортежа & р из-за которой p.third также ошибка

+3

Что происходит, когда вы пытаетесь использовать его? – wallyk

+2

Почему бы не создать класс, содержащий int, int, std :: array (при условии, что T меняется) – pm100

+0

Можете ли вы помочь, как это сделать. Я не уверен, как я могу двигаться дальше. – Vamsi

ответ

0

Если вы знаете, какие типы вы хотите, чтобы вернуться, почему не вы использовать, простую структуру:

template <typename T> 
struct return_type { 
    int a; 
    int b; 
    std::array<T> c; 
} 
0

Похоже, вы пытаетесь расширить код с помощью unpair и std::pair:

t_untuple<T1, T2, T3>& operator = (const tuple <T1, T2, T3>& p) 
    { 
     a1 = p.first; 
     a2 = p.second; 
     a3 = p.third; 
     return *this; 
    } 
}; 

, но доступ полей кортежа сделаны по-другому:

t_untuple<T1, T2, T3>& operator = (const std::tuple <T1, T2, T3>& p) 
    { 
     a1 = std::get<0>(p); 
     a2 = std::get<1>(p); 
     a3 = std::get<2>(p); 
     return *this; 
    } 
}; 

также необходимо заменить unpair на untuple в вашей копии пасты:

template <typename T1, typename T2, typename T3> 
t_untuple<T1, T2, T3> untuple(T1& a1, T2& a2, T3& a3) 
{ 
    return t_untuple<T1, T2, T3>(a1, a2, a3); 
} 

не забудьте #include <tuple> и вы должны убедитесь, что вы компилятор, по крайней мере, в режиме C++ 11

+0

Привет, Я беру эту ошибку при выполнении кода. ошибка: «кортеж» не называет тип t_untuple и оператор = (Const кортежей & р) – Vamsi

+0

изменения в 'станд :: tuple' и не забудьте включить как я добавил к ответу – Slava

0

Предполагаемый тип массива инвариантен. Либо использовать станд :: кортеж

std::tuple<int,int,std::array<std::string>> MyFunc() 

здесь человек страница http://en.cppreference.com/w/cpp/utility/tuple

или создать конкретный класс

struct IIA 
{ 
    int a; 
    int b; 
    std::array<std::string> arr; 
} 

IAA Myfunc(){} 
+0

Он уже использует 'std :: tuple', он хочет создать хелпер для распаковки значений. – Slava

+0

u прав - он может подумать, что он – pm100

Смежные вопросы