1

EDIT: I understand I could create a named function to solve the problem. I just want to learn some arcane C++ template syntax from you gurus.


Given this setup (the vector is guaranteed to be initially empty)

typedef vector<list<int>> V;
V v;

I want to create a partial application like this:

auto f = [&v](int value) { v.push_back(list<int> { value }); };

Unfortunately, in our working environment, we can't use lambda (with gcc 4.4). Can anyone help me writing an equivalent version using std::bind?

So far I come up with several attempts (using Visual Studio):

1.

auto f = bind<void (V::*)(const V::value_type&)>(&V::push_back, &v, list<int>(1, placeholders::_1));

with error

'<function-style-cast>': cannot convert from 'initializer list' to 'std::list<int,std::allocator<_Ty>>'

2.

auto f = bind<void (V::*)(const V::value_type&)>(&V::push_back, &v, list<int>::list(1, placeholders::_1));

with error

'std::list<int,std::allocator<_Ty>>::list': none of the 10 overloads could convert all the argument types

3.

auto f = bind<void (V::*)(const V::value_type&)>(&V::push_back, &v, list<int> { placeholders::_1 });

with error

'initializing': cannot convert from 'initializer list' to 'std::list<int,std::allocator<_Ty>>'

4.

auto f = bind<void (V::*)(const V::value_type&)>(&V::push_back, &v, list<int> { (const int&) placeholders::_1 });

this compiles, but the vector created by f(10) would have a list with the first element equals to 0, not 10. It looks like the list is a default created one.

Reci
  • 4,099
  • 3
  • 37
  • 42

0 Answers0