c++ - 指针列表的成员函数

标签 c++ foreach pointer-to-member

感谢您对以下内容发表评论。

Class1 { debug(std::ostream&){} };
int main() {
  std::vector<Class1*> list1;
  // some work to do
}

目标平台:

  • 平台(1):Win 7x64,VS2010
  • 平台(2):Linux x32,g++ 4.4

问:将“std::cout”传递给以下语句的正确方法应该是什么?

std::for_each(list1.begin(), 
              list1.end(), 
              "afunction(&Class1::debug, std::cout)");

我之前在 debug() 函数中使用了“std::cout”,但后来考虑为调试消息的输出提供灵 active 。

编辑:更多信息:如果仿函数对象是要走的路,我应该如何实现仿函数来处理多个类(这些类除了相同的“调试”函数签名外没有任何关系)?

Edit(2): 使用“std::for_each”,是否可以直接为每个类调用相应的析构函数来销毁list1 中的所有对象? (例如 for_each(l.begin(), l.end(), "Class::~Class1");

编辑(3):按照“pmr”的建议,我把声明写成

std::for_each(l.begin(), 
              l.end(), 
              std::bind2nd(std::mem_fn(&Class1::debug), out) );

在linux平台上编译运行正常,在VS2010上编译运行失败,Class1::debug代码为

void Class1::debug(const std::ostream& out)
{ 
    out << "some text" << someVar << "some text" << std::endl; 
}

VS 错误信息是

错误 C2678:二进制“<<”:未找到接受类型为“const std::ostream”的左侧操作数的运算符(或没有可接受的转换)

有什么提示吗?

我现在为我的类实现了重载运算符 <<,并关闭了调试打印功能的使用。非常感谢您提供的所有提示。

最佳答案

由于您使用的是 g++ 4.4,因此您不能使用 lambda 表达式,这将是首选(更高版本支持它们,MSVC 也支持)。

所以你需要一个仿函数。仿函数是一个函数对象,它是一个实现operator() 的类(或结构)。像这样:

class Debug
{
public:
     Debug(ostream& os) : _os(os)
     { }

     void operator()(Class1* instance)
     {
          // will print the pointer, replace with user code
          os << instance << endl;
     }
private:
     ostream& _os;
};

像这样使用:

 Debug d(cout);
 std::for_each(list1.begin(), list1.end(), d);

关于c++ - 指针列表的成员函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9530859/

相关文章:

c++ - 在 C 中使用 bind() 时获取错误的 IP 地址

php - 第二次在 foreach 中未在函数内部定义变量

c++ - 如何在需要自由函数的地方传递成员函数?

javascript - 为什么这段代码不返回 false?

c++ - 你如何将一个类的函数作为参数传递给同一个类的另一个函数

c++ - 指向成员的指针作为模板参数推导

c++ - 用剩菜初始化类

c++ - 通过 const 引用将参数传递给非 void 函数 : is it considered as a side effect?

c++ - 为什么我在间接使用基类 typedef 时总是出现语法错误,而直接使用它没问题?

php - 获得前 6 件元素