X-Git-Url: http://git.tdb.fi/?p=libs%2Fdatafile.git;a=blobdiff_plain;f=source%2Floader.h;fp=source%2Floader.h;h=b9eee50d8cde99b49fc897952580fa1d1695893e;hp=648c414cd2158b7d83983988f8027525b53940e6;hb=fbe7e81c08a6b5a3f9ccdcbeb4dd4d351a5f4226;hpb=e14c01b5775dd2e324b16ff49498db9b9113c523 diff --git a/source/loader.h b/source/loader.h index 648c414..b9eee50 100644 --- a/source/loader.h +++ b/source/loader.h @@ -85,10 +85,10 @@ protected: /** Loads a sub-object from the statement being processed with an extra parameter for the Loader. The Loader class of the sub-object is automatically used. */ - template - void load_sub(S &s, T &p) + template + void load_sub(S &s, Args &&... args) { - typename S::Loader ldr(s, p); + typename S::Loader ldr(s, std::forward(args)...); load_sub_with(ldr); } @@ -119,6 +119,10 @@ protected: void add(const std::string &k, void (L::*func)(B0, Args...), const typename std::remove_reference::type &b0) { add(k, new LoaderFuncNBound1(func, b0)); } + template + void add(const std::string &k, void (L::*func)(B0, Args...), B0 &&b0) + { add(k, new LoaderFuncNBound1(func, std::forward(b0))); } + /** Adds a keyword that is loaded into a member of the loaded object. */ template void add(const std::string &k, T0 L::*p0) @@ -161,12 +165,12 @@ Loads an object from a file. The object must have a public Loader class. Any extra arguments are passed to the Loader constructor. */ template -void load(T &obj, const std::string &fn, Args &... args) +void load(T &obj, const std::string &fn, Args &&... args) { IO::BufferedFile in(fn); Parser parser(in, fn); - typename T::Loader loader(obj, args...); + typename T::Loader loader(obj, std::forward(args)...); loader.load(parser); } @@ -176,14 +180,14 @@ public Loader class. The collection is passed to the Loader constructor, followed by any extra arguments. */ template -void load(T &obj, typename T::Loader::Collection &coll, const std::string &fn, Args &... args) +void load(T &obj, typename T::Loader::Collection &coll, const std::string &fn, Args &&... args) { RefPtr in = coll.open_raw(fn); if(!in) throw IO::file_not_found(fn); Parser parser(*in, fn); - typename T::Loader loader(obj, coll, args...); + typename T::Loader loader(obj, coll, std::forward(args)...); loader.load(parser); } @@ -192,14 +196,14 @@ Loads an object from a file stored in a collection. The object must havea public Loader class. Any extra arguments are passed to the Loader constructor. */ template -typename std::enable_if::value>::type load(T &obj, C &coll, const std::string &fn, Args &... args) +typename std::enable_if::value>::type load(T &obj, C &coll, const std::string &fn, Args &&... args) { RefPtr in = coll.open_raw(fn); if(!in) throw IO::file_not_found(fn); Parser parser(*in, fn); - typename T::Loader loader(obj, args...); + typename T::Loader loader(obj, std::forward(args)...); loader.load(parser); }