令人困惑的标题,希望有些代码会澄清:
struct MyNestedType {
void func();
};
struct MyType {
MyNestedType* nested;
}
std::vector<MyType> vec;
// ... populate vec
// I want something approximating this line, but that doesn't use made-up C++!
std::for_each(vec.begin(), vec.end(), std::mem_fun_ref(&MyType::nested->func));
所以基本上我想在容器的每个元素上调用一个方法,但它实际上并不是类型的方法,它是包含类型的一些方法...我知道我可以编写一个函数对象来传递“这个电话,但有一些方法我想打电话,这会变得很乱。
有什么想法吗?
答案 0 :(得分:6)
为什么不使用简单的for循环?
for(vector<MyType>::iterator i = vec.begin(); i != vec.end(); ++i)
i->nested->func();
或者,您可以使用lambda表达式或boost :: foreach
FOREACH(MyType x, vec)
x.nested->func();
你可以使用binders和mem_funs构建你的表达式,但这会变得非常混乱和混乱!将所有内容放在一个std :: foreach行中没有任何好处。
答案 1 :(得分:3)
你可以使用这样的仿函数
template <typename T, T* MyType::* TMember, void (T::* TNestedMember)() >
struct Caller {
Caller() {
}
template <typename TObject>
void operator()(TObject object) {
(object.*TMember->*TNestedMember)();
}
};
解决您的问题
struct MyNestedType {
MyNestedType(int a):
a_(a){
}
void func() {
std::cout << "MyNestedType::func " << a_ << std::endl;
}
void foo() {
std::cout << "MyNestedType::foo " << a_ << std::endl;
}
int a_;
};
struct MyType {
MyNestedType* nested;
};
int main()
{
std::vector<MyType> vec;
std::auto_ptr<MyNestedType> nt1(new MyNestedType(2));
std::auto_ptr<MyNestedType> nt2(new MyNestedType(5));
MyType t1 = {nt1.get()};
MyType t2 = {nt2.get()};
vec.push_back(t1);
vec.push_back(t2);
std::for_each(vec.begin(), vec.end(),
Caller<MyNestedType, &MyType::nested, &MyNestedType::func>());
std::for_each(vec.begin(), vec.end(),
Caller<MyNestedType, &MyType::nested, &MyNestedType::foo>());
}
答案 2 :(得分:2)
也许你可以在结构MyType()中添加func():
void func(...) {
nested->func(...);
}
这样你就不会有单独的适配器函数,而是包装类型中的聚合,即非常规则的OOP技术。
答案 3 :(得分:2)
如果你想使用for_each,你需要一个仿函数。
struct CallMyFunc
{
void operator()(MyType& obj) { obj.nested->func();}
};
std::for_each(vec.begin(), vec.end(), CallMyFunc());
或者我会使用下面描述的boost :: FOREACH语法:
达里奥:Call member functions of members of elements of a container with for_each?
答案 4 :(得分:2)
是的,可以使用boost::bind
来解决这个问题,但它会变得混乱。请使用@Dario的提升方式 - 但是为了完整性,这里是boost::bind
提升
std::for_each(vec.begin(), vec.end(),
boost::bind(&MyNestedType::func, boost::bind(&MyType::nested, _1)));
无论如何,碰巧,我们甚至没有得到一个很好的单行:)
答案 5 :(得分:0)
如何使用Boost的transform_iterator
?