Использование boost::привязать вывод в виде индекса массива
Вопрос
Как мне заставить boost::bind работать с индексами массива?Вот чего я пытаюсь достичь.Пожалуйста, посоветуйтесь.
[сервенейл:C ++ Progs]$ g ++ -v
Чтение спецификаций из /usr/lib/gcc/i386-redhat-linux/3.4.6/спецификации
Сконфигурированный с:../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr /share/info --включить общий доступ --включить потоки=posix --отключить проверку с помощью system-zlib --включить__cxa_atexit --отключить libunwind-исключения --включить java-awt=gtk --host=i386- redhat-linux
Модель резьбы:posix ( положение )
версия gcc 3.4.6 20060404 (Red Hat 3.4.6-3)
[сервенейл:Проги C ++]$ 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());
}
[сервенейл:Проги C++]$ g++ -o t-array_bind t-array_bind.cpp t-array_bind.cpp:В функции `int main()':t-array_bind.cpp:40:ошибка:нет совпадения с 'operator[]' в
'массив[boost::lambda::bind(const Arg1&, const Arg2&) [с Arg1 = int std::pair::*, Arg2 = boost::лямбда::лямбда_функтор >](((const boost::лямбда::лямбда_функтор >&)(+boost::лямбда::::_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)
)
));
Редактировать:Я изменил функтор, чтобы вернуть n-й элемент массива.
Другие советы
Причина, по которой ваш код не компилируется, заключается в том, что возвращаемое значение boost::bind
является не целочисленный тип, который может быть использован в качестве нижнего индекса массива.Скорее, boost::bind
возвращает определяемый реализацией функциональный объект неуказанного типа, который может быть вызван с помощью ()
оператор.