Мне нужно передать в индекс map
который является std::wstring
и его значение, которое также является std::wstring
, функции-члену, которая занимает 3 std::wstrings
в качестве аргументов.
Я пытаюсь использовать boost::bind
в write
метод в class Result
как показано в примере кода ниже ..
Я публикую код с большей ясностью и получаю ошибки компиляции.
typedef std::map<std::wstring,std::wstring> map_type;
class Print
{
public:
Print(){};
virtual ~Print(){};
void setValue(const std::wstring & str1, const std::wstring & str2,
const std::wstring & str3 = L"")
{
wprintf(L"String1[%ls] String2[%ls] String3[%ls]\n",str1.c_str(), str2.c_str(), str3.c_str());
}
};
class Result : public Print
{
public:
Result(){};
virtual ~Result(){};
void write(const std::wstring val1, const std::wstring val2, const std::wstring val3)
{
std::map<std::wstring,std::wstring> my_map_test;
my_map_test[L"Idx1"]=L"Value1";
my_map_test[L"Idx2"]=L"Value2";
for_each(my_map_test.begin(), my_map_test.end(),
boost::bind(&Result::setValue,
boost::bind(&map_type::value_type::first,_1),
boost::bind(&map_type::value_type::second,_1), L"TEST"));
}
};
int _tmain(int argc, _TCHAR* argv[])
{
Result result;
result.write();
return 0;
}
Благодарю.
Кажется, что ваш typedef
не совсем верно. Кроме этого кажется, что вы пропускаете скобки после каждого из ваших вложенных bind()
выражения. Похоже на то, Data::setValue
является функцией-членом, т. е. ей также нужно дать объект, к которому она будет применена. То есть я думаю, что вы хотите использовать это так:
std::for_each(mem_ptr->properties.m_properties_map.begin(),
mem_ptr->properties.m_properties_map.end(),
boost::bind(&Data::setValue,
boost::ref(object),
boost::bind(&map_type::value_type::first, _1),
boost::bind(&map_type::value_type::second, _1),
L"Str"));
˙
К сожалению, я не могу проверить, что это действительно сработает, потому что вы предоставили только частичный код. В противном случае это интересная идея для расширения пары с помощью композиции. Обратите внимание, что first
а также second
также являются членами (из std::pair<K, V>
) но эти члены можно «вызывать», используя только один параметр, а именно объект, для которого они вызываются. Для членов данных bind()
делает вид, что они могут быть вызваны для доступа к значению соответственно
После повторного тестирования, он работает сейчас, единственным параметром, который отсутствовал при использовании boost :: bind, был указатель «this», как показано ниже
for_all (my_map_test,
повышение :: Bind (&Результат :: SetValue, этот,
повышение :: Bind (&map_type :: value_type :: первый, _1),
повышение :: Bind (&map_type :: value_type :: second, _1), L «TEST»));