From d27aad810d5920caff328a13e804c824c4adfa67 Mon Sep 17 00:00:00 2001 From: nojhan Date: Sun, 26 Apr 2020 23:58:03 +0200 Subject: [PATCH] fix: use perfect forwarding in forges - Avoid some cases of implicit copy instead of correct reference forwarding. - Use C++-17's make_from_tuple instead of the previous complex machinery. --- eo/src/eoForge.h | 40 ++++++++++++---------------------------- 1 file changed, 12 insertions(+), 28 deletions(-) diff --git a/eo/src/eoForge.h b/eo/src/eoForge.h index f56666991..91731ab03 100644 --- a/eo/src/eoForge.h +++ b/eo/src/eoForge.h @@ -101,8 +101,8 @@ template class eoForgeOperator : public eoForgeInterface { public: - eoForgeOperator(Args... args) : - _args(args...), + eoForgeOperator(Args&&... args) : + _args(std::forward(args)...), _instanciated(nullptr) { } @@ -120,7 +120,7 @@ class eoForgeOperator : public eoForgeInterface if(_instanciated) { delete _instanciated; } - _instanciated = constructor(_args); + _instanciated = op_constructor(_args); } return *_instanciated; } @@ -131,31 +131,15 @@ class eoForgeOperator : public eoForgeInterface } protected: - std::tuple _args; + std::tuple _args; private: /** Metaprogramming machinery which deals with arguments lists @{ */ - template - struct index {}; - - template - struct gen_seq : gen_seq {}; - - template - struct gen_seq<0, Idx...> : index {}; - - template - Op* constructor(std::tuple& args, index) + template + Op* op_constructor(T& args) { - Op* p_op = new Op(std::get(args)...); - _instanciated = p_op; - return p_op; - } - - template - Op* constructor(std::tuple& args) - { - return constructor(args, gen_seq{}); + // FIXME double-check that the copy-constructor is a good idea to make_from_tuple with dynamic storage duration. + return new Op(std::make_from_tuple(args)); } /** @} */ @@ -243,9 +227,9 @@ class eoForgeVector : public std::vector*> /** Add an operator to the list. */ template - void add(Args... args) + void add(Args&&... args) { - auto pfo = new eoForgeOperator(args...); + auto pfo = new eoForgeOperator(std::forward(args)...); this->push_back(pfo); } @@ -263,11 +247,11 @@ class eoForgeVector : public std::vector*> * @warning The operator at `index` should have been added with eoForgeVector::add already.. */ template - void setup(size_t index, Args... args) + void setup(size_t index, Args&&... args) { assert(index < this->size()); delete this->at(index); // Silent on nullptr. - auto pfo = new eoForgeOperator(args...); + auto pfo = new eoForgeOperator(std::forward(args)...); this->at(index) = pfo; }