Skip to content

Optimized adding to container – forward arguments to element constructor

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