dynamic val_;
};
-template<class... Args>
-inline dynamic::ObjectMaker dynamic::object(Args&&... args) {
- return dynamic::ObjectMaker(std::forward<Args>(args)...);
+// This looks like a case for perfect forwarding, but our use of
+// std::initializer_list for constructing dynamic arrays makes it less
+// functional than doing this manually.
+inline dynamic::ObjectMaker dynamic::object() { return ObjectMaker(); }
+inline dynamic::ObjectMaker dynamic::object(dynamic&& a, dynamic&& b) {
+ return ObjectMaker(std::move(a), std::move(b));
+}
+inline dynamic::ObjectMaker dynamic::object(dynamic const& a, dynamic&& b) {
+ return ObjectMaker(a, std::move(b));
+}
+inline dynamic::ObjectMaker dynamic::object(dynamic&& a, dynamic const& b) {
+ return ObjectMaker(std::move(a), b);
+}
+inline dynamic::ObjectMaker
+dynamic::object(dynamic const& a, dynamic const& b) {
+ return ObjectMaker(a, b);
}
//////////////////////////////////////////////////////////////////////
struct ObjectMaker;
public:
- template<class... Args> static ObjectMaker object(Args&&...);
+ static ObjectMaker object();
+ static ObjectMaker object(dynamic&&, dynamic&&);
+ static ObjectMaker object(dynamic const&, dynamic&&);
+ static ObjectMaker object(dynamic&&, dynamic const&);
+ static ObjectMaker object(dynamic const&, dynamic const&);
/*
* String compatibility constructors.
EXPECT_ANY_THROW(d4.setDefault("foo", "bar"));
}
+TEST(Dynamic, ObjectForwarding) {
+ // Make sure dynamic::object can be constructed the same way as any
+ // dynamic.
+ dynamic d = dynamic::object("asd", {"foo", "bar"});
+ dynamic d2 = dynamic::object("key2", {"value", "words"})
+ ("key", "value1");
+}
+
int main(int argc, char** argv) {
testing::InitGoogleTest(&argc, argv);
google::ParseCommandLineFlags(&argc, &argv, true);