On 03/21/2014 12:31 PM, Konrad Rybacki wrote:
Unfortunately, with the code you have proposed I get the following error:
...
And so on...
Sorry, I didn't test it, just assumed this was the source of the problem.
After some struggling I finally managed to fix the code, however the
solution isn't perfect.
#include
#include
#include
#include <iostream>
#include <map>
class Test
{
public:
typedef boost::optional> Value;
typedef Value::reference_const_type
(Value::*GetValueOrConstFn)(Value::reference_const_type) const;
Value m_value;
};
int main(int argc, const char* argv[])
{
Test t1, t2;
std::string empty("empty");
auto b1 = boost::lambda::bind(&Test::m_value, boost::lambda::_1);
// static_cast is based on http://stackoverflow.com/a/2862235/1776942
auto b2 =
boost::lambda::bind(static_castTest::GetValueOrConstFn(&Test::Value::get_value_or),
boost::lambda::_1, empty);
b1(t1) = "Test value";
std::cout << b2(b1(t1)) << '\n'; // "Test value"
std::cout << b2(b1(t2)) << '\n'; // Should be "empty"
return 0;
}
The first problem was that boost::lambda::bind can't infer the return
type out of overloaded member function (see [1] for a related SO
question). The second problem was that b2 functor was passed an invalid
argument. The argument passed was of Test type, not Test::Value, as
expected by Test::Value::get_value_or().
Note that you could replace boost::lambda::bind with boost::bind to get
rid of this ugly static_cast:
auto b2 =
boost::bindTest::Value::reference_const_type(&Test::Value::get_value_or,
_1, empty);
This works too and looks much better.
P.S. I compiled it using clang on Ubuntu Linux so I had to change some
minor bits in the code.
WBR,
Adam Romanek