2017-11-02 8 views
0

vertex_triangleというヘルパー関数を呼び出すと、vector<pair<T, T>>を取り込み、整列した三角形にしてから順にvectorに入れることができます。私は私のリターンオブジェクトとしてこれを使用しています:ベクトルなしの順序を返す

template<typename T> 
triangle<T> vertex_triangle(const size_t index, const 
vector<pair<T, T>>& polygon){ 
    if (0 == index){ 
     return Triangle(polygon.back(), polygon.front(), polygon[1]); 
    }else if (index == (polygon.size() - 1)){ 
     return Triangle(polygon[polygon.size() - 2], polygon.back(), polygon.front()); 
    }else{ 
     return Triangle(polygon[index - 1], polygon[index], polygon[index + 1]); 
    } 
} 

はもともと私が直接このすべて作られた意味のようvector<Triangle<T>> fooでリターンを配置した:

template <Typename T> 
struct Triangle { 
    Triangle(const pair<T, T>& first, const pair<T, T>& second, const pair<T, T>& third) { 
     data[0] = first; 
     data[1] = second; 
     data[2] = third; 
    } 
    pair<T, T> data[3]; 
}; 

は、だから私の巻きヘルパー関数は次のようになります

foo.push_back(vertex_triangle(i, bar)) 

今、私はので、私はvertex_triangleのリターンを解凍する必要があると思いますvector<pair<T, T>> fooを使用する必要があります。

const auto temp = vertex_triangle(i, bar); 

foo.push_back(temp[0]); 
foo.push_back(temp[1]); 
foo.push_back(temp[2]); 

しかし、私は本当に一時オブジェクト好きではない、何とか彼らを開梱、ポイントのコピーを戻すことなく、私はfoobarからVertsのを押したい順序を返す方法があり、それらをプッシュ1つずつ戻ってくる?

+0

しかし、私はもっと良いものを望んでいた。 –

答えて

0

したがって、your comment on using an out parameterはここでは最も直接的なオプションです。もう1つの方法はラムダを返すことです。だから、例えば:

template <typename T> 
auto vertex_triangle(const size_t index, const vector<pair<T, T>>& polygon) { 
    const auto& first = index == 0U ? polygon.back() : polygon[index - 1U]; 
    const auto& second = polygon[index]; 
    const auto& third = index == size(polygon) - 1U ? polygon.front() : polygon[index + 1U]; 

    return [&](auto& output){ output.push_back(first); 
           output.push_back(second); 
           output.push_back(third); }; 
} 

は、このように呼ばれることができます:それは私の現在のソリューションもvertex_triangle `に出パラメータとしてfoo``で取ることです価値がある何のため

vertex_triangle(i, bar)(foo) 

Live Example

関連する問題