سؤال

كيف أحصل على دفعة :: ربط للعمل مع مجموعة من الصفيف؟ إليك ما أحاول تحقيقه. من فضلك النصيحة.

Servenail: C ++ Progs] $ g ++
قراءة المواصفات من /usr/lib/gcc/i386-redhat-linux/3.4.6/specs
تم تكوينه مع: ../configure - prefix = / usr - mr - usr / share / man --infodir = / usr / share / contin - inith-system-zlib - __ cxa_atexit - استثناءات libunwind-java-java-awt = java-awt = gtk - host = i386- redhat-linux
نموذج الموضوع: posix
نسخة من دول مجلس التعاون الخليجي 3.4.6 20060404 (قبعة حمراء 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 tray_bind t-array_bind.cpp t-array_bind.cpp: في الوظيفة `int الرئيسية () ': t-array_bind.cpp: 40: خطأ: لا تطابق" المشغل " []' في
'صفيف [دفعة :: lambda :: bind (const arg1 & str const arg2 &) [with arg1 = int :: * * arg2 = دفعة :: lambda :: lambda_functor>] (((const boost :: lambda: : Lambda_Functor> &) (+ دفعة :: Lambda :::: _ 1)))

شكرا جزيلا.

هل كانت مفيدة؟

المحلول

كما أوضح تشارلز، يعزز BOOST :: BIND كائن وظيفة وليس عددا صحيحا. سيتم تقييم كائن الوظيفة لكل عضو. سيحل بنية المساعد القليل من المشكلة:

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) 
             )
         ));

تحرير: لقد غيرت Functor لإرجاع عنصر NTH من الصفيف.

نصائح أخرى

السبب في أن الكود الخاص بك لا يترجم هو أن قيمة الإرجاع boost::bind يكون ليس نوع عدد صحيح يمكن استخدامه كغضلة صفيف. على الاصح، boost::bind إرجاع كائن وظيفة محددة بالتنفيذ من نوع غير محدد، والذي يمكن استدعاؤه باستخدام () المشغل أو العامل.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top