lambdaを使用して複雑さを大幅に軽減できるコードがいくつかあります。しかし残念ながら、C++ 11を完全にサポートしていないコンパイラを使用する必要があり、簡単に切り替えることはできません。今問題は、利用可能な機能がないラムダ式にできるだけ近いロジックを維持する方法です(つまり、std::function
が利用可能で、ラムダは使用できません)。lambdaをpre-lambdaコンパイラで処理する方法
通常の解決策はどこかファンクタを定義し、適切な場所でそれを使用することです:
struct functor{
functor(type & member) : m_member(member) {}
void operator()(...) {...}
type & m_member;
};
void function() {
use_functor(functor(...));
}
私はそれをたくさん嫌いが、私は、非常にこのパターンを使用しています。クラスを定義しない主な理由は、通常、ファンクタはSTL内で使用され、テンプレートは関数のインラインで定義された構造体が好きではないということです。しかし、私の場合、use_functor()
関数は通常の方法になるので、関数自体の中で関数を定義することができます(各関数は1つの関数内でのみ使用されます)。
void function() {
struct functor{
functor(type & member) : m_member(member) {}
void operator()(...) {...}
type & m_member;
};
use_functor(functor(...));
}
これはやや改善されているようですが、私が望むより醜いコードが必要です。たとえば、私はファンクタの名前を完全に取り除きたいと思います。私はそれが唯一の値を使用する場合、匿名の構造体を作成することは可能です知っている。
void function() {
struct{
// functor(type member) : m_member(member) {}
void operator()(...) {...}
// type & m_member;
} callback ;
use_functor(callback);
}
は、しかし、この時点で私は、必要なデータメンバを提供する方法について見当もつかない。構造体は匿名であるため、コンストラクタはありません。私は簡単にメンバーを設定することができます。なぜなら、メンバーは一般公開されているからですが、これもまた私が嫌う行を追加することになります。
目標は、この問題を完全に排除することができるクリーンラムダを持つコンパイラに切り替えた後、できるだけ変更する必要がない状態にしておくことです。
どうやってこれをやりますか? callback
にtype &
参照m_member
を設定する
void function() {
type the_thing;
struct {
void operator()(...) {...}
type & m_member;
} callback = {the_thing};
use_functor(callback);
}
:あなたが行うことができますコンストラクタのない匿名struct
のメンバ変数のinitalisationに関して
古いGCCの中には、関数内でネストされた構造体からstd :: function <>への変換を処理しないものもあります。だから私はオプション1を使用してロジックを分離することを余儀なくされています。 – LiKao