Frage

Wie erhalte ich boost :: bind an der Arbeit mit Array-Indizes? Hier ist, was ich versuche zu erreichen. Bitte Beratung.

[servenail: C ++ Progs] $ g ++ -v
Lesedaten von /usr/lib/gcc/i386-redhat-linux/3.4.6/specs
Konfiguriert mit: ../configure prefix = / usr --mandir = / usr / share / man --infodir = / usr / share / info --enable-shared --enable-threads = posix disable-checking --with-System-zlib --enable -__ cxa_atexit --disable-libunwind-Ausnahmen --enable-java-aWT = gtk --host = i386-redHat-linux
Thread-Modell: Posix
gcc Version 3.4.6 20.060.404 (Red Hat 3.4.6-3)

  

[servenail: C ++ Progs] $ cat t-array_bind.cpp

#include <map>
#include <string>
#include <algorithm>
#include <boost/lambda/lambda.hpp>
#include <boost/lambda/bind.hpp>
#include <iostream>

using namespace std;
using namespace boost;
using namespace boost::lambda;

class X
{
public:
    X(int x0) : m_x(x0)
    {
    }

    void f()
    {
        cout << "Inside function f(): object state = " << m_x << "\n";
    }

private:
    int m_x;
};

int main()
{
    X x1(10);
    X x2(20);
    X* array[2] = {&x1, &x2};

    map<int,int> m;
    m.insert(make_pair(1, 0));
    m.insert(make_pair(2, 1));

    for_each(m.begin(),
             m.end(),
             array[bind(&map<int,int>::value_type::second, _1)]->f());
}
  

[servenail: C ++ Progs] $ g ++ -o t-array_bind t-array_bind.cpp      t-array_bind.cpp: In Funktion `int main () ':       t-array_bind.cpp: 40: Fehler: keine Übereinstimmung für 'Operator []'
  ‚Array [lambda boost :: :: bind (const   Arg1 &, const Arg2 &) [mit arg1 = int   std :: pair :: *, Arg2 =   boost :: lambda :: lambda_functor>] (((const boost :: lambda :: lambda_functor> &) (+ boost :: Lambda :::: _ 1)))]

Vielen Dank.

War es hilfreich?

Lösung

Wie Charles hat erklärt, boost :: bind kehrt ein Funktionsobjekt und nicht eine ganze Zahl. Das Funktionsobjekt wird für jedes Mitglied werden ausgewertet. Ein kleiner Helfer Struktur löst das Problem:

struct get_nth {
    template<class T, size_t N>
    T& operator()( T (&a)[N], int nIndex ) const {
        assert(0<=nIndex && nIndex<N);
        return a[nIndex];
    }
}

for_each(m.begin(),
         m.end(),
         boost::bind( 
             &X::f,
             boost::bind( 
                 get_nth(), 
                 array, 
                 bind(&map<int,int>::value_type::second, _1) 
             )
         ));

Edit: Ich habe den Funktor geändert, um das n-te Element des Arrays zurück.

Andere Tipps

Der Grund, Ihr Code nicht kompilieren läßt, weil der Rückgabewert von boost::bind ist nicht ein Integer-Typ, der als Array-Index verwendet werden kann. Vielmehr boost::bind gibt eine Implementierung definiert Funktionsobjekt von einem nicht näher Typ, der den () Operator aufgerufen werden können.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top