Boost lambda:调用对象上的方法
我正在将 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());
我可以使用接口或模板方法让“任何类”部分工作,但还没有找到如何使“任何方法”部分工作部分工作。
有没有办法做一些类似于 C++ 中的“d => d.GetId()”lambda 的事情(无论有没有 Boost)?
另外,更多使算法具有通用性的 C++ 解决方案也受到欢迎。
我在 VS2008 中使用 C++/CLI,因此无法使用 C++0x lambda。
I'm looking at boost::lambda as a way to to make a generic algorithm that can work with any "getter" method of any class.
The algorithm is used to detect duplicate values of a property, and I would like for it to work for any property of any class.
In C#, I would do something like this:
class Dummy
{
public String GetId() ...
public String GetName() ...
}
IEnumerable<String> FindNonUniqueValues<ClassT>
(Func<ClassT,String> propertyGetter) { ... }
Example use of the method:
var duplicateIds = FindNonUniqueValues<Dummy>(d => d.GetId());
var duplicateNames = FindNonUniqueValues<Dummy>(d => d.GetName());
I can get the for "any class" part to work, using either interfaces or template methods, but have not found yet how to make the "for any method" part work.
Is there a way to do something similar to the "d => d.GetId()" lambda in C++ (either with or without Boost)?
Alternative, more C++ian solutions to make the algorithm generic are welcome too.
I'm using C++/CLI with VS2008, so I can't use C++0x lambdas.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
假设,我明白你在寻找什么,你可以使用
boost::bind
:实际上,你只需要
boost::mem_fn
甚至std:: mem_fun
,但是boost::bind
会让你有更多的通用性。在这种情况下,您可以将 FindNonUniqueValues 定义为:
这里,我不太确定您的 FindNonUniqueValues 如何获取其对象列表(或者确切地说它应该返回什么) - IEnumerable 是像迭代器一样吗?),所以你可以填写它。
Assuming, I understand what you're looking for, you can use
boost::bind
:Actually, you just need
boost::mem_fn
or evenstd::mem_fun
, butboost::bind
will allow you a bit more generality.In this case, you would define
FindNonUniqueValues
as something like:Here, I'm not really sure how your
FindNonUniqueValues
gets its list of objects (or exactly what it's supposed to return - is anIEnumerable
like an iterator?), so you could fill that in.为了便于将来参考,这是我在遵循已接受答案的想法后得出的解决方案:
示例使用:
For future reference, here's the solution I ended with, after following ideas from the accepted answer:
Example use: