1 /* +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 Copyright (c) 2017-2021 The plumed team 3 (see the PEOPLE file at the root of the distribution for a list of names) 4 5 See http://www.plumed.org for more information. 6 7 This file is part of plumed, version 2. 8 9 plumed is free software: you can redistribute it and/or modify 10 it under the terms of the GNU Lesser General Public License as published by 11 the Free Software Foundation, either version 3 of the License, or 12 (at your option) any later version. 13 14 plumed is distributed in the hope that it will be useful, 15 but WITHOUT ANY WARRANTY; without even the implied warranty of 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17 GNU Lesser General Public License for more details. 18 19 You should have received a copy of the GNU Lesser General Public License 20 along with plumed. If not, see <http://www.gnu.org/licenses/>. 21 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ */ 22 #ifndef __PLUMED_tools_ForwardDecl_h 23 #define __PLUMED_tools_ForwardDecl_h 24 25 #include <memory> 26 #include <utility> 27 28 namespace PLMD { 29 30 /** 31 Utility class for forward declaration of references. 32 33 */ 34 template <class T> 35 class ForwardDecl: 36 std::unique_ptr<T> 37 { 38 public: 39 // Construction with arbitrary argument. 40 template<typename ...Args> 41 explicit ForwardDecl(Args &&...args); 42 // Dereference operator is inherited from std::unique_ptr<T> 43 using std::unique_ptr<T>::operator *; 44 }; 45 46 template <class T> 47 template<typename ...Args> ForwardDecl(Args &&...args)48ForwardDecl<T>::ForwardDecl(Args &&...args): 49 std::unique_ptr<T>(new T(std::forward<Args>(args)...)) 50 {} 51 52 53 } 54 55 #endif 56