1
#include <iostream>
#include <vector>
#include <algorithm>
#include <functional>

class A{
  public:
    A():n(4),d(6.6),f(2.7),s("hello my dear"){}
    ~A(){}
    void printAll()
    {
      std::cout << this->n << "\n" << this->d << "\n" << this->f << "\n" << this->s << "\n\n";
    }
  private:
    int n;
    double d;
    float f;
    std::string s;
};

int main(){
  std::vector<A*> v(100);
  //filling v ...
  std::for_each(v.begin(), v.end(), mem_fun_ref(&A*::printAll)); // this isn't supposed to work ?
  return(0);
}

私は多くの解決策を試しましたが、これは最後の解決策ですが、どれも機能していません。C++11より古いC++バージョンの解決策をターゲットにしているので、ラムダを避けたいと思います(また、私は持っていませんラムダでこれを機能させるための問題、私の問題はfor_eachサイクルのみにあります)。

明確さとコードの可読性のために、奇妙なバインディングソリューションを避けたいと思います。また、このソリューションは、プログラムにさらに1つのライブラリを追加する傾向があります。

では、カスタム型へのポインターを参照するときに、for_eachサイクル内のメソッドに簡単にアクセスするにはどうすればよいですか?

ありがとう。

4

3 に答える 3

3

まず、ベクトルにはポインターstd::mem_funが含まれているため、 ではなくが必要ですstd::mem_fun_ref

第二に、それstd::mem_funだけではありませんmem_fun

第 3 に、メンバーへのポインターの適切な構文は であり&A::printAll、 ではありません&A*::printAll。あれはそこで何をしているの*ですか?

于 2012-10-27T20:09:00.537 に答える
2

メンバー関数のアドレスは&A::printAllではなく&A::*printAllです。

std::for_each(v.begin(), v.end(), mem_fun_ref(&A*::printAll)); /
//                                              ^ error here - not need this *

メンバー関数型へのポインターを定義する構文によって誤解を招く可能性があります-このアスタリスクが必要な場合:

typedef void (A*::PrintAll)();

[UPDATE]
そして、セカンダリ(またはプライマリ-あなたのコメントから理解したように)の問題は、オブジェクトポインターでメンバー関数を呼び出すために使用される間違った関数でした-詳細については、 AndreyTの回答を参照してください

于 2012-10-27T20:05:37.137 に答える
2

std::mem_funポインターを受け取る関数オブジェクトを作成するために使用します。

またはstd::mem_fn、C++11 を使用している場合、ポインター、スマート ポインター、および参照を受け取る関数オブジェクトを生成する場合に使用します。

std::for_each(v.begin(), v.end(), std::mem_fn(&A::printAll))
于 2012-10-27T20:10:14.727 に答える