以下のmany
などのテンプレート構造体を使用すると、固定されていない可能性のあるオブジェクトを返却し、 ++ 17構造化バインディング(auto [a,b,c] = f();
は変数abとcを宣言し、構造体やタプルなどを返すfからその値を割り当てます)。C++用可変長集計(構造体)と構文の返却17可変長テンプレート '建設控除ガイド'
template<typename T1,typename T2,typename T3>
struct many {
T1 a;
T2 b;
T3 c;
};
// guide:
template<class T1, class T2, class T3>
many(T1, T2, T3) -> many<T1, T2, T3>;
auto f(){ return many{string(),5.7, unmovable()}; };
int main(){
auto [x,y,z] = f();
}
としてはstd::tuple
が集約初期化をサポートしていない、(Multiple return values (structured bindings) with unmovable types and guaranteed RVO in C++17も、 Do std::tuple and std::pair support aggregate initialization?特にaccepted answer by ecatmur)これらの二つの質問と回答で説明しました。つまり、移動不可能な型を保持して戻すことはできません。しかし、many
のような単純な構造体はこれを行うことができます。
任意の数の引数で動作するmany
の可変版を作成することはできますか?
更新:many
のテンプレートバージョンでは、次のガイド構文を使用できますか?
template<typename Args...>
many(Args...) -> many<Args...>;
'auto std :: tie(a、b、c)= ...'のようなsgのどこかに提案があることに注意してください。 – lorro
@lorro IMOそれは悪い考えです:それは、ライブラリ機能としてコア言語機能のポーズを作成します。コンパイラは潜在的な 'using'や名前空間の宇宙などを解決しなければならないことは言うまでもありません。 –
@Revolver_Ocelot:私はそれがもっとうまくいくと思っていますが、いくつかの異なる/追加の理由で、すなわち、それは他の機能と直交していません。これを行う私の好きなやり方は、関数のパラメータの位置を含めて、どこでも変数*を宣言することです。 私が持っているもう1つの問題は、 'a = ...'と書かれているのに対し、 'decltype(a)'の*コンストラクタ*を呼び出すことです。 – lorro