diff --git a/src/domain_decomposition/MakeBlockDataInitFunction.h b/src/domain_decomposition/MakeBlockDataInitFunction.h index c6446b919b5a650cf67c7ae474766950decbe3a5..de41cd696de30b312f47883cbc59987a3e6b71d2 100644 --- a/src/domain_decomposition/MakeBlockDataInitFunction.h +++ b/src/domain_decomposition/MakeBlockDataInitFunction.h @@ -34,119 +34,19 @@ namespace domain_decomposition { /// \cond internal namespace internal { - template<class T> - T * newFunc( const IBlock* const ) { - return new T(); + template<class T, typename... Args> + T * newFunc( const IBlock* const, Args&... args ) { + return new T(args...); } - - template<class T, class P1> - T * newFunc( const IBlock* const , const P1 & p1 ) { - return new T(p1); - } - - template<class T, class P1, class P2> - T * newFunc( const IBlock* const , const P1 & p1, const P2 & p2 ) { - return new T(p1, p2); - } - - template<class T, class P1, class P2, class P3> - T * newFunc( const IBlock* const , const P1 & p1, const P2 & p2, const P3 & p3 ) { - return new T(p1, p2, p3); - } - - template<class T, class P1, class P2, class P3, class P4> - T * newFunc( const IBlock* const , const P1 & p1, const P2 & p2, const P3 & p3, const P4 & p4 ) { - return new T(p1, p2, p3, p4); - } - - template<class T, class P1, class P2, class P3, class P4, class P5> - T * newFunc( const IBlock* const , const P1 & p1, const P2 & p2, const P3 & p3, const P4 & p4, const P5 & p5 ) { - return new T(p1, p2, p3, p4, p5); - } - - template<class T, class P1, class P2, class P3, class P4, class P5, class P6> - T * newFunc( const IBlock* const , const P1 & p1, const P2 & p2, const P3 & p3, const P4 & p4, const P5 & p5, const P6 & p6 ) { - return new T(p1, p2, p3, p4, p5, p6); - } - - template<class T, class P1, class P2, class P3, class P4, class P5, class P6, class P7> - T * newFunc( const IBlock* const , const P1 & p1, const P2 & p2, const P3 & p3, const P4 & p4, const P5 & p5, const P6 & p6, const P7 & p7 ) { - return new T(p1, p2, p3, p4, p5, p6,p7); - } - - template<class T, class P1, class P2, class P3, class P4, class P5, class P6, class P7, class P8> - T * newFunc( const IBlock* const , const P1 & p1, const P2 & p2, const P3 & p3, const P4 & p4, const P5 & p5, const P6 & p6, const P7 & p7, const P8 & p8 ) { - return new T(p1, p2, p3, p4, p5, p6, p7,p8 ); - } - - template<class T, class P1, class P2, class P3, class P4, class P5, class P6, class P7, class P8, class P9> - T * newFunc( const IBlock* const , const P1 & p1, const P2 & p2, const P3 & p3, const P4 & p4, const P5 & p5, const P6 & p6, const P7 & p7, const P8 & p8, const P9 & p9 ) { - return new T(p1, p2, p3, p4, p5, p6, p7,p8, p9 ); - } - } // namespace internal /// \endcond -template<class T> -std::function< T* ( const IBlock* const block ) > -makeBlockDataInitFunction() { - return std::bind( internal::newFunc<T>, std::placeholders::_1); -} - -template<class T, class P1> -std::function< T* ( const IBlock* const block ) > -makeBlockDataInitFunction(const P1 & p1) { - return std::bind( internal::newFunc<T,P1>, std::placeholders::_1,p1); -} - -template<class T, class P1, class P2> -std::function< T* ( const IBlock* const block ) > -makeBlockDataInitFunction(const P1 & p1, const P2 & p2) { - return std::bind( internal::newFunc<T,P1,P2>, std::placeholders::_1,p1,p2); -} - -template<class T, class P1, class P2, class P3> -std::function< T* ( const IBlock* const block ) > -makeBlockDataInitFunction(const P1 & p1, const P2 & p2, const P3 & p3) { - return std::bind( internal::newFunc<T,P1,P2,P3>, std::placeholders::_1,p1,p2,p3); -} - -template<class T, class P1, class P2, class P3, class P4> -std::function< T* ( const IBlock* const block ) > -makeBlockDataInitFunction(const P1 & p1, const P2 & p2, const P3 & p3, const P4 & p4) { - return std::bind( internal::newFunc<T,P1,P2,P3,P4>, std::placeholders::_1,p1,p2,p3,p4); -} - -template<class T, class P1, class P2, class P3, class P4, class P5> -std::function< T* ( const IBlock* const block ) > -makeBlockDataInitFunction(const P1 & p1, const P2 & p2, const P3 & p3, const P4 & p4, const P5 & p5) { - return std::bind( internal::newFunc<T,P1,P2,P3,P4,P5>, std::placeholders::_1,p1,p2,p3,p4,p5); -} - -template<class T, class P1, class P2, class P3, class P4, class P5, class P6> -std::function< T* ( const IBlock* const block ) > -makeBlockDataInitFunction(const P1 & p1, const P2 & p2, const P3 & p3, const P4 & p4, const P5 & p5, const P6 & p6) { - return std::bind( internal::newFunc<T,P1,P2,P3,P4,P5,P6>, std::placeholders::_1,p1,p2,p3,p4,p5,p6); -} - -template<class T, class P1, class P2, class P3, class P4, class P5, class P6, class P7> -std::function< T* ( const IBlock* const block ) > -makeBlockDataInitFunction(const P1 & p1, const P2 & p2, const P3 & p3, const P4 & p4, const P5 & p5, const P6 & p6, const P7 & p7) { - return std::bind( internal::newFunc<T,P1,P2,P3,P4,P5,P6,P7>, std::placeholders::_1,p1,p2,p3,p4,p5,p6,p7); -} - -template<class T, class P1, class P2, class P3, class P4, class P5, class P6, class P7, class P8> -std::function< T* ( const IBlock* const block ) > -makeBlockDataInitFunction(const P1 & p1, const P2 & p2, const P3 & p3, const P4 & p4, const P5 & p5, const P6 & p6, const P7 & p7, const P8 & p8) { - return std::bind( internal::newFunc<T,P1,P2,P3,P4,P5,P6,P7,P8>, std::placeholders::_1,p1,p2,p3,p4,p5,p6,p7,p8); -} - -template<class T, class P1, class P2, class P3, class P4, class P5, class P6, class P7, class P8, class P9> +template<class T, typename... Args> std::function< T* ( const IBlock* const block ) > -makeBlockDataInitFunction(const P1 & p1, const P2 & p2, const P3 & p3, const P4 & p4, const P5 & p5, const P6 & p6, const P7 & p7, const P8 & p8, const P9 & p9) { - return std::bind( internal::newFunc<T,P1,P2,P3,P4,P5,P6,P7,P8,P9>, std::placeholders::_1,p1,p2,p3,p4,p5,p6,p7,p8,p9); +makeBlockDataInitFunction(Args&&... args) { + return std::bind( internal::newFunc<T,Args...>, std::placeholders::_1, std::forward<Args>(args)... ); }