diff --git a/include/msgpack/object.hpp b/include/msgpack/object.hpp index 065adf1d..159f9b8f 100644 --- a/include/msgpack/object.hpp +++ b/include/msgpack/object.hpp @@ -511,6 +511,15 @@ inline T* object::convert(T* v) const return v; } +template +inline bool object::convert_if_not_nil(T& v) const { + if (is_nil()) { + return false; + } + convert(v); + return true; +} + #if defined(MSGPACK_USE_CPP03) template diff --git a/include/msgpack/object_fwd.hpp b/include/msgpack/object_fwd.hpp index fcbfd030..ac446729 100644 --- a/include/msgpack/object_fwd.hpp +++ b/include/msgpack/object_fwd.hpp @@ -149,6 +149,9 @@ struct object { template T* convert(T* v) const; + template + bool convert_if_not_nil(T& v) const; + object(); object(const msgpack_object& o); diff --git a/test/convert.cpp b/test/convert.cpp index fc4ced0a..b30ecade 100644 --- a/test/convert.cpp +++ b/test/convert.cpp @@ -93,3 +93,20 @@ TEST(convert, return_value_ref) EXPECT_EQ(&i, &j); EXPECT_EQ(i, j); } + +TEST(convert, if_not_nil_nil) +{ + msgpack::object obj; + int i; + EXPECT_FALSE(obj.convert_if_not_nil(i)); +} + +TEST(convert, if_not_nil_not_nil) +{ + msgpack::zone z; + msgpack::object obj(1, z); + + int i; + EXPECT_TRUE(obj.convert_if_not_nil(i)); + EXPECT_EQ(i, 1); +}