提升lambda:在对象上调用方法

cka*_*ras 0 c++ boost boost-lambda

我正在研究boost :: lambda作为一种通用算法,可以使用任何类的任何"getter"方法.

该算法用于检测属性的重复值,我希望它适用于任何类的任何属性.

在C#中,我会做这样的事情:

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

IEnumerable<String> FindNonUniqueValues<ClassT>
  (Func<ClassT,String> propertyGetter) { ... }
Run Code Online (Sandbox Code Playgroud)

示例使用方法:

var duplicateIds   = FindNonUniqueValues<Dummy>(d => d.GetId());
var duplicateNames = FindNonUniqueValues<Dummy>(d => d.GetName());
Run Code Online (Sandbox Code Playgroud)

我可以使用接口或模板方法来获取"任何类"部分,但尚未找到如何使"for any method"部分工作.

有没有办法在C++中使用类似"d => d.GetId()"lambda(有或没有Boost)?

另外,更多的C++ ian解决方案也可以使算法通用.

我正在使用带有VS2008的C++/CLI,所以我不能使用C++ 0x lambdas.

Jes*_*der 6

假设,我明白你在寻找什么,你可以使用boost::bind:

FindNonUniqueValues<Dummy>(boost::bind(&Dummy::GetId, _1));
Run Code Online (Sandbox Code Playgroud)

实际上,你只需要boost::mem_fn甚至std::mem_fun,但boost::bind会让你更具普遍性.

在这种情况下,您将定义FindNonUniqueValues为:

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

在这里,我不确定你如何FindNonUniqueValues获取它的对象列表(或者它应该返回的内容 - IEnumerable就像迭代器一样?),所以你可以填写它.