Повышение. Свяжите со станд. доступа:: элементы карты в станд.:: for_each

У меня есть карта, которая снабжает простую структуру ключом. Структура имеет две функции членства, каждый - константа другой нет. Я справился с вызовом функции константы использование станд.:: for_each без любых проблем, но у меня есть некоторые проблемы при вызывании функции неконстанты.

struct MyStruct {
  void someConstFunction() const;
  void someFunction();
};

typedef std::map<int, MyStruct> MyMap;
MyMap theMap;

//call the const member function
std::for_each(theMap.begin(), theMap.end(),
   boost::bind(&MyStruct::someConstFunction, boost::bind(&MyMap::value_type::second, _1)));

//call the non-const member function
std::for_each(theMap.begin(), theMap.end(),
   boost::bind(&MyStruct::someFunction, boost::bind(&MyMap::value_type::second, _1)));

Вызов к функции членства константы хорошо работает, но кажется, что повышение внутренне ожидает константу MyStruct где-нибудь и таким образом перестало работать со следующей ошибкой компиляции в MSVC7.1.

boost\bind\mem_fn_template.hpp (151): ошибка C2440: 'аргумент': не может преобразовать из 'константы MyStruct * __ w64' к 'MyStruct *константа'

Я ценил бы любую справку о том, как установить шаблонные параметры правильно, поэтому свяжите, действительно распознает параметры правильно и позволять мне вызвать не функцию константы.

спасибо, Carl

8
задан Carl 22 February 2010 в 15:09
поделиться

4 ответа

IIRC, Boost.Bind использует boost::mem_fn для возможности привязки к членам. Теперь, если вы посмотрите на mem_fun (прокрутите вниз до части // поддержка членов данных), вы увидите, что он типизирует свой result_type как const&, но при этом имеет перегрузку оператора вызова функции, поддерживающую извлечение неконстантного члена из неконстантного аргумента.

Таким образом, кажется, что проблема в том, что это сбивает с толку механизм вычитания возвращаемого типа в Boost.Bind. Решением может быть явное указание Bind на то, что результат не является const:

//call the non-const member function
std::for_each(theMap.begin(), theMap.end(),
   boost::bind(&MyStruct::someFunction, 
       boost::bind<MyStruct&>(&MyMap::value_type::second, _1)
   )
);
8
ответ дан 5 December 2019 в 08:52
поделиться

Если вы уже зависите от Boost , вы можете проверить Boost Foreach

BOOST_FOREACH(MyMap::value_type const& val, MyMap)
{
  val.second.someConstFunction();
}

Много удобочитаемо, хотя я не знаю о проблемах с производительностью.

Также обратите внимание, что вы не можете использовать шаблонный тип в макросе без «экранирования» символа , :

  • либо с помощью typedef перед
  • , либо с помощью второй пары круглых скобок вокруг тип
4
ответ дан 5 December 2019 в 08:52
поделиться

Одна проблема, которую я заметил: второй bind вызывается для не члена функции. second - это член данных, а не метод std::pair

0
ответ дан 5 December 2019 в 08:52
поделиться

$ _ SERVER ['DOCUMENT _ ROOT'] даст вам путь к htdocs, затем вы можете перейти оттуда

EDIT

$ _ SERVER ['ПРОСИТЬ _ URI'] всегда даст вам /myapp/stuff/to/see из приведенного выше примера URL-адреса, независимо от расположения файлов на диске или из какого файла

так что это только вопрос взорвать ing, массив _ сдвиг ing и взорвать ing.

btw, из вашей структуры каталогов, похоже, вы используете инфраструктуру. некоторые рамки имеют библиотеку URI/URL, которую можно найти полезной (по крайней мере, CodeIgniter имеет, не уверен на 100% с другими рамками)

-121--2552738-

Извлечь sigcheck.exe из Sysinternals Номера люкс . Это утилита командной строки, отображающая номер версии файла, информацию о метках времени и сведения о цифровой подписи.

-121--2432324-

Если вам придется многое сделать, я рекомендую вам использовать библиотеку Boost.ReyEx:

#include <boost/range/algorithm/for_each.hpp>
#include <boost/range/adaptor/map.hpp>
#include <boost/mem_fn.hpp>
#include <map>

struct MyStruct {
  void someConstFunction() const;
  void someFunction();
};

typedef std::map<int, MyStruct> MyMap;
MyMap theMap;

int main()
{
    //call the const member function
    boost::for_each(theMap | boost::adaptors::map_values,
                    boost::mem_fn(&MyStruct::someConstFunction));

    //call the non-const member function
    boost::for_each(theMap | boost::adaptors::map_values,
                    boost::mem_fn(&MyStruct::someFunction));
}

Она была принята в Boost, но пока не поставляется с официальным дистрибутивом. Пока вы не сможете загрузить его из Boost Vault (ссылка на застежку -молнию).

7
ответ дан 5 December 2019 в 08:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: