У меня есть карта, которая снабжает простую структуру ключом. Структура имеет две функции членства, каждый - константа другой нет. Я справился с вызовом функции константы использование станд.:: 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
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)
)
);
Если вы уже зависите от Boost
, вы можете проверить Boost Foreach
BOOST_FOREACH(MyMap::value_type const& val, MyMap)
{
val.second.someConstFunction();
}
Много удобочитаемо, хотя я не знаю о проблемах с производительностью.
Также обратите внимание, что вы не можете использовать шаблонный тип в макросе без «экранирования» символа ,
:
Одна проблема, которую я заметил: второй bind вызывается для не члена функции. second - это член данных, а не метод std::pair
$ _ 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 Номера люкс . Это утилита командной строки, отображающая номер версии файла, информацию о метках времени и сведения о цифровой подписи.
Если вам придется многое сделать, я рекомендую вам использовать библиотеку 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 (ссылка на застежку -молнию).