How to simply provide arguments for a new item?
template< typename... T > void addElement( T&&... t ) { elements.emplace_back( std::unique_ptr< Element >( new Element( std::forward< T >( t )... ) ) ); }
With C ++ 14, you can also use std::make_unique :
template< typename... T > void addElement( T&&... t ) { elements.emplace_back( std::make_unique< Element >( std::forward< T >( t )... ) ); }
If you want to create elements derived from Element , you can also do this (C ++ version 14):
template< typename C, typename... T > void emplace_back( T&&... t ) { elements.emplace_back( std::make_unique< C >( std::forward< T >( t )... ) ); }
and it can be used as follows:
gui.emplace_back< Element >(); // insert a class derived from Element (hope you have a virtual dtor!) gui.emplace_back< DerivedFromElement >(); // calls Element::Element( int, const char* ) or similar... gui.emplace_back< Element >( 42, "Hallo" );
Daniel Frey
source share