2016-06-19 1 views
1

は、私は、構造体C++チェックするためにテンプレート配列に任意のパラメータを提供していますか?

struct FStruct 
{ 
    FName ObjectName; 
}; 

を持っていると私は私がそれをどのように行うか、に対してチェックすることObjClassからそれに変数を提供する必要があり

template <typename T, typename LookType> 
static T* GetFromArray(LookType LookFor, TArray<T> InArray) 
{ 
    for (T* TIter : InArray) 
    { 
     if (LookFor == TIter.LookParameter) // <-- How to provide LookParameter? 
     { 
      return TIter; 
     } 
    } 

    return nullptr; 
} 

テンプレート静的な機能を持っているとしましょうか?

基本的用法のようなものが考えられます。

MyStaticLib::GetFromArray<FStruct, FName>(FName("Bob"), PeopleArray, FStruct::ObjectName) 
+0

これはおそらくどのように動作するかわかりません。 'Titer'が' T * 'ならば、' Titer.somethingorother'がどのようにしてC++になるのか分かりません。 –

+2

標準['std :: find'](http://en.cppreference.com/w/cpp/algorithm/find)関数を見てみることをお勧めします。まず第一に、ホイールを再作成しようとしないでください。しかし、* predicate *(呼び出し可能なもの、関数へのポインタのようなもの、またはオブジェクト'operator()'メンバ関数(これには[lambda expressions](http://en.cppreference.com/w/cpp/language/lambda)を含みます)を使用しています)。 –

+0

@SamVarshavchikそれが事実かもしれないと心配しました、本質的に上記を行うための別の方法がありますか?私はさまざまなパラメータ型の最後の手段として関数をオーバーロードする可能性があります。 – Vii

答えて

1

は残念ながら、それはあなたが示唆されている方法で、フィールドの名前を渡すことは本当にことはできません、これはC++が持っていない反射の萌芽します。現代のC++では、ロジックの一部としてフィールドの名前をエンコードする関数を渡すことができます。これは、コメントのJoachim Pileborgの提案に沸騰して終了します。つまり、あなたが書くことができます。

auto found = std::find_if(InArray.begin(), InArray.end(), 
    [&] (const auto& x) { 
     return x.LookParameter == LookFor; 
}); 

あなたは、関数または関数テンプレートでこれをラップすることができますが、本当にあなたを購入することすべては始まりと終わりを呼び出すために持っていません。ユーザーが==を含むラムダを渡す必要がないようにするためのきれいな方法はありませんが、正にこれはそれほど悪くありません。マクロを書くことですきれいではない方法で、あり

:C++プログラマーとして

#define GET_FROM_ARRAY(array, fieldname, lookfor) \ 
    std::find_if(array .begin(), array .end(), \ 
    [&] (const auto& x) { \ 
     return x. fieldname == lookfor ; \ 
    }) 

auto found = GET_FROM_ARRAY(InArray, FName, LookFor); 

が、それは技術的にはあなたが望むものに最も近いものを話していますように、私は同時に、この答えを提供する義務です私はそれが悪い考えであるとあなたに伝えることも義務付けられています。これはC++です。

+0

助けていただきありがとうございます。誰かがマクロを提案するたびに、免責条項「do not do it」で来るようです:)。 – Vii

+0

@Viiこれは、最も高いC++プログラマが高コストになっているからです。そのマクロは名前空間に入れることはできません。プリプロセッサが最初に実行され、引数が2回評価されるなどの驚くべきエラーが発生するため、マクロの上に他の抽象を実際に構築することはできません。私は、私が関与しているどのチームでもコードレビューを渡すために上記に書いたが、ちょっと、私はあなたにロープを渡しているだけで、あなた自身を掛けるかどうかを決めることができる;-) –

関連する問題