Передача карты в качестве аргумента с использованием boost :: bind

Мне нужно передать в индекс 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;
}

Благодарю.

-1

Решение

Кажется, что ваш 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() делает вид, что они могут быть вызваны для доступа к значению соответственно

0

Другие решения

После повторного тестирования, он работает сейчас, единственным параметром, который отсутствовал при использовании 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»));

0

По вопросам рекламы [email protected]