0

私はboost::lambdaを、任意のクラスの任意の「getter」メソッドで機能する汎用アルゴリズムを作成する方法として見ています。

このアルゴリズムは、プロパティの重複値を検出するために使用されます。どのクラスのどのプロパティでも機能するようにしたいと思います。

C#では、次のようにします。

class Dummy
{
    public String GetId() ...
    public String GetName() ...
}

IEnumerable<String> FindNonUniqueValues<ClassT>
  (Func<ClassT,String> propertyGetter) { ... }

メソッドの使用例:

var duplicateIds   = FindNonUniqueValues<Dummy>(d => d.GetId());
var duplicateNames = FindNonUniqueValues<Dummy>(d => d.GetName());

インターフェイスまたはテンプレートメソッドのいずれかを使用して、for "any class"部分を機能させることができますが、 "foranymethod"部分を機能させる方法はまだ見つかりません。

C++で「d=>d.GetId()」ラムダに似た何かを行う方法はありますか(Boostの有無にかかわらず)?

アルゴリズムをジェネリックにするための代替のより多くのC++ianソリューションも歓迎されます。

VS2008でC++/ CLIを使用しているため、C++0xラムダを使用できません。

4

2 に答える 2

6

私はあなたが探しているものを理解していると仮定して、あなたは使うことができますboost::bind

FindNonUniqueValues<Dummy>(boost::bind(&Dummy::GetId, _1));

実際には、必要なだけでなく、boost::mem_fnさらに一般化することもできます。std::mem_funboost::bind

この場合、次のように定義FindNonUniqueValuesします。

template <typename T>
/* ? */ FindNonUniqueValues(boost::function<std::string (const T&)> getter) { ... }

ここではFindNonUniqueValues、オブジェクトのリストをどのように取得するか(または、正確に何を返すIEnumerableかはイテレータのようなものですか?)がよくわからないので、それを入力できます。

于 2010-05-01T19:44:58.500 に答える
2

将来の参考のために、受け入れられた回答からのアイデアに従った後、私が終了した解決策は次のとおりです。

template < typename ObjectT, typename ValueT > std::vector <ObjectT>
FindInstancesWithDuplicateValue(
   vector<ObjectT> allValues, mem_fun_ref_t<ValueT, ObjectT> getter)
{ 
    // [...create a *sorted* list of  ObjectT, ordered by ObjectT.getter()...]
    // [...loop through the sorted list to find identical adjacent values...]
        // call the mem_fun_ref_t:
        ValueT value1 = getter(*iterPrev);
        ValueT value2 = getter(*iter);
        if (value1 == value2) // duplicates found
    // ...
}

使用例:

vector<Dummy> list;
list.push_back(Dummy(1, "1-UniqueValue"));
list.push_back(Dummy(2, "2-DuplicateValue"));
list.push_back(Dummy(3, "2-DuplicateValue"));
list.push_back(Dummy(4, "3-UniqueValue"));

vector<Dummy> dummyWithduplicateNames = 
    FindInstancesWithDuplicateValue<Dummy,CString>
    (list, mem_fun_ref(&Dummy::GetName));

// returns Dummy(2, "2-DuplicateValue") and Dummy(3, "2-DuplicateValue")
于 2010-05-02T00:03:54.337 に答える