首页 / 算法 / C成员函数指针和STL算法
C成员函数指针和STL算法
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了C成员函数指针和STL算法,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2396字,纯文字阅读大概需要4分钟。
内容图文
![C成员函数指针和STL算法](/upload/InfoBanner/zyjiaocheng/747/4a98936ef9b747c7bf0a1cce6a26a0ac.jpg)
我有一个抽象的functor类,它重载operator()和实现它的派生对象.
我有一个函数(另一个类的一部分)试图获取这些函子类的数组并尝试将指向成员函数的指针传递给std算法for_each(),这里是我正在做的概述:
编辑:我已经重新清理它并把旧的小例子说清楚了.
class A{
operator()(x param)=0;
operator()(y param)=0;
}
class B: public A{
operator()(x param); //implemented
operator()(y param);
}
...// and other derived classes from A
void ClassXYZ::function(A** aArr, size_t aSize)
{
...//some code here
for(size_t i = 0; i< aSize; i++){
A* x = aArr[i];
for(v.begin(), v.end(), ...//need to pass pointer/functor to right operator() of x here
..//other code
}
我已经尝试了几种方法,我无法弄清楚如何使它工作,我需要使用抽象类型,因为我可以有不同的派生类型,但他们都必须实现相同的运算符()(参数x )功能.
我只需要for_each()函数就可以调用成员函数operator()(param x).我有一个不同的功能,它具有具体的实现,只是传递一个实例,它的工作原理.我试图在这里取得类似的效果,但不知道我给出的具体课程.
我究竟做错了什么?
解决方法:
如果我了解您要执行的操作,则代码段中会出现相当多的错误:
> sizeof aArr是错误的,你需要明确传递大小(ChrisW注意到)
>在operator()()的原始声明中缺少虚拟说明符
>不确定你的for循环在哪里结束,因为没有匹配}(我怀疑它根本不应该存在)
这里有一些代码将循环遍历A(或A派生)对象的数组,并在每个对象上调用operator(),作为param参数传递传入的参数:
#include <iostream>
#include <algorithm>
#include <functional>
using namespace std;
typedef double param; // Just for concreteness
class A {
public:
virtual void operator()(param x) = 0;
};
class B : public A {
public:
void operator()(param x) { cerr << "This is a B! x==" << x << ".\n"; }
};
void function(A** aArr, size_t n, param theParam) {
void (A::*sFunc)(param x) = &A::operator();
for_each(aArr, aArr + n, bind2nd(mem_fun(sFunc), theParam));
}
int main(int argc, char** argv) {
A* arr[] = { new B(), new B(), new B() };
function(arr, 3, 42.69);
delete arr[0];
delete arr[1];
delete arr[2];
return 0;
}
将1参数成员函数指针转换为2参数函数对象需要mem_fun(); bind2nd()然后从那里生成一个1参数的函数对象,它将提供给function()的参数固定为第二个参数. (for_each()需要1参数函数指针或函数对象.)
编辑:基于Alex Tingle’s answer,我推断你可能希望function()在一个A派生对象上做很多事情.在这种情况下,你会想要这样的东西:
void function(A** aArr, size_t n, vector<param> const& params) {
for (size_t i = 0; i < n; ++i) {
void (A::*sFunc)(param x) = &A::operator();
for_each(params.begin(), params.end(), bind1st(mem_fun(sFunc), aArr[i]));
}
}
内容总结
以上是互联网集市为您收集整理的C成员函数指针和STL算法全部内容,希望文章能够帮你解决C成员函数指针和STL算法所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。