Simple add to container:
struct SomeContainer
{
void Add (const SomeStructOptimized in_s)
{
v.emplace_back(in_s);
}
std::vector<SomeStructOptimized> v;
};
SomeContainer c;
c.Add(SomeStructOptimized(4711, 3.14, "Hello"));
// => SomeStructOptimized is created and then copied
// even when changing to move semantics a move operation would be necessary
Optimized add to container:
struct SomeContainerOptimized
{
template <typename... T>
void Add(T&&... in_params)
{
v.emplace_back(std::forward<T>(in_params)...); //<<< optimization by forwarding
// this code has not to be changed if number and/or type of
// constructor arguments for SomeStructOptimized changes!
}
std::vector<SomeStructOptimized> v;
};
SomeContainerOptimized cOpt;
cOpt.Add(4711, 3.14, "Hello");
// => parameters are forwarded into container,
// SomeStructOptimized is constructed only once, directly within container