5

以下の「解決策」はコンパイルされますが、それは私が望むものではありません。putメンバー関数をfor_eachではなくに渡したいのですが*this。ブーストの使用はオプションではありません。これはC++03内で解決できますか?

#include <algorithm>
#include <functional>
#include <vector>
using namespace std;

class Wheel { };

class Car {

public:

    void process(const vector<Wheel>& wheel) {

        for_each(wheel.begin(), wheel.end(), *this);
    }

    void operator()(const Wheel& w) { put(w); }

private:

    void put(const Wheel& w) { }
};

int main() {

    vector<Wheel> w(4);

    Car c;

    c.process(w);

    return 0;
}
4

3 に答える 3

12

mem_funはい、とbind1stテンプレートを組み合わせて使用​​できます。

void process(const vector<Wheel>& wheel) {
    for_each(wheel.begin(), wheel.end(), bind1st(mem_fun(&Car::put), this));
}

の呼び出しは、レシーバとしてmem_fun機能する a と の 2 つの引数を取る新しい関数オブジェクトを作成し、最初のパラメータをレシーバとして、2 番目のパラメータを引数として呼び出します。次に呼び出すと、この関数の最初のパラメーターとしてレシーバー オブジェクトが所定の位置にロックされます。Car*Wheelputbind1st

ただし、このコードを機能させるには、このコードに小さな変更を加える必要があると思います。アダプターは、bind1st引数を const 参照で受け取る関数ではうまく機能しないため、参照ではなく値で受け取るように変更する必要がある場合があります。putWheel

于 2011-01-09T23:26:33.430 に答える
3

mem_fun_refを使用できます:ここを参照してください。

mem_fun_refオブジェクトのベクトルがある場合に機能するはずです:

for_each(wheel.begin(), wheel.end(), mem_fun_ref(&Wheel::put));

上記の例は、putCarではなくWheelのメンバーに変更されていることに注意してください。それはあなたにそれをどのように使うかについての考えを与えるはずです。

mem_funオブジェクトへのポインタのベクトルがある場合に使用します

于 2011-01-09T23:41:39.533 に答える
1

もちろん、boost::mem_func に相当するものを独自に作成することもできます。TR1にもあります。引数の数を増やしたい場合は少し繰り返しになりますが、概念的には難しくありません。

template<typename T, typename mem_func_type> struct mem_func_internal;
template<typename T, typename Ret> struct mem_func_internal<T, Ret (T::*)()> {
    typedef Ret(T::* functype)();
    T* obj;
    functype func;
    Ret operator()() {
        return obj->*func();
    }
};
template<typename T, typename Ret, typename ArgType1> struct mem_func_internal<T, Ret (T::*)(ArgType1) {
    typedef Ret(T::* functype)();
    T* obj;
    functype func;
    Ret operator()(ArgType1 arg) {
        return obj->*func(arg);
    }
 }
template<typename T, typename mem_func_type> struct mem_func : public mem_func_internal<T, mem_func_type> {
    mem_func(T* object, mem_func_type mem_func)
        : obj(object)
        , func(mem_func) {}
};
template<typename T, typename mem_func_type> mem_func<T, mem_func_type> bind_mem_func(T* object, mem_func_type func) {
    return mem_func<T, mem_func_type>(object, func);
}
// Usage
std::for_each(wheel.begin(), wheel.end(), bind_mem_func(this, &Car::put));

このようなコードを書いたのは久しぶりなので、少しずれているかもしれません。しかし、それはそれの要点です。ラムダを使わずに使用例を書くのはとても難しいです。

于 2011-01-09T23:28:08.783 に答える