読者です 読者をやめる 読者になる 読者になる

関数で複数の返り値(戻り値)を返すのをラムダ式でする

C++ プログラミング

C++03までは関数で複数の返り値を表現する際は配列を利用するしかありませんでした。ただその場合は返り値専用の配列を利用するので返り値をわかりやすい名前の別の変数に代入するときやそのまま出力して終わりなどという時は若干無駄なことをしてる感じがあり、不用意に変なところからアクセスできないようブロックで囲んでスコープを制限するなどコードが無意味に冗長になります。関数内にstaticで確保してそのポインタを返すにしてもいつ中身が書き換えられるかもしれず非常に怖いです。
 それを解決する方法としてC++11より導入されたラムダ式を思いつきました。ラムダ式は結局構文糖衣に過ぎないので今まででも同じようなことは出来るのですが冗長になり配列のほうがまだいい感じになってしまいます。
とりあえず以下のコードを見てください。

#include<iostream>
#include<string>

template<class T>
void foo(T ReturnData){
    ReturnData(1,"String");	
}



int main(){

	//例1
	foo([](int a, std::string b){std::cout<<"返り値"<<a<<","<<b<<std::endl;});

        //例2
	int hoge;
	std::string bar;
	foo([&hoge,&bar](int a, std::string b){hoge=a;bar=b;});
	std::cout<<"hogeの値"<<hoge<<" "<<"barの値"<<bar<<std::endl;

	return 0;
}

引数に返り値を処理するためのファンクタ(ラムダ式)を渡します。そうして内部で返り値としたいデータを引数にして渡しています。
こうすることで、例1では一時変数(配列)を確保することなく出力し、例2では返り値を設定したい変数を直に変更することに成功しています。
 効率がどうこうというのは僕はよくまだ理解できていないのですが、少なくともC++03と比べ、したいことをダイレクトに記述できてすっきりとしているのではないでしょうか?