【问题标题】:Accessing member from a static function - std::foreach从静态函数访问成员 - std::foreach
【发布时间】:2013-08-16 19:23:01
【问题描述】:

是否可以通过std::for_each访问静态成员函数?

我在尝试编写代码时遇到了问题。我有一个类Foo,它在成员部分初始化Boo 的对象,我需要在std::foreach() 详细信息中使用的静态成员函数内部访问它:

Foo.h

class Foo {
   public: 
      Foo() {

          w = getInstanceOfAnotherClass(0, 0); // this works fine!
      }
      void Transform();

      static inline void processBlock(std::vector<double> &vect);

   private: 
     std::vector<std::vector<double> > data;
     Boo* w;
}; 

这是问题所在:在成员函数Transform内部我有以下内容:

void Foo::Transform() 
{
    std::for_each(data.begin(), data.end(), processBlock);
}

ProcessBlock 我有以下内容:

void Foo::processBlock(std::vector<double> &vect) 
{
    std::vector<double> vars = w.getDataBack<double>(); 
}

返回的错误是w 在静态成员函数中无效使用成员'w',现在,我知道问题出在哪里了。但我不知道有什么解决方法。我决定创建另一个非静态函数,然后从 processBlock 内部调用此函数,但是,如果不声明对象就无法调用成员函数,因此会重新设置 w 的值和这不是我想要的。

我希望有人可以提供帮助,并且这篇文章不会令人困惑。

【问题讨论】:

  • 你会用 C++11 吗?如果是这样,最简单的解决方案是编写一个捕获 this 的 lambda 而不是静态函数。
  • @jrok 嘿,谢谢你的回复。我可以使用 C++11,但是,我是新标准和 Lambda 的新手,你能推荐一个研究这个的地方,或者提供一个例子吗?谢谢
  • 既然w是一个指针,你也应该写w-&gt;
  • 我想今天有人问了一个非常相似的问题。让我试着找到它。编辑:here.
  • @JoeMajsterski:不,因为for_each 使用单个参数调用它的函数。如果您向静态函数添加第二个参数,则需要一个 lambda 或 bind,就像使用非静态函数一样。

标签: c++ oop static-members


【解决方案1】:

Foo 我这样做的方式是使用函数调用而不是静态函数。使用

void processBlock(std::vector&lt;double&gt; &amp;vect);

还有

std::for_each(data.begin(),data.end(),std::bind(&amp;Foo::processBlock,this,_1))

【讨论】:

  • 这可行 :) 我真的很想尝试 Lambda 方法,但是,这很好用!
  • Lamda 的工作很好,我只是更习惯于绑定,因为 Visual Studio 10 :-P。它应该只是 [this](std::vector&lt;double&gt;&amp; vect){this-&gt;processBlock(vect);} 但老实说我对它不是很熟悉,而且我现在无法测试它,也不喜欢发布我无法测试的东西。
猜你喜欢
  • 2021-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-03
  • 2012-08-23
相关资源
最近更新 更多