C++ の forward と move を使って emplace を再実装した例2021年03月16日 12時14分00秒

C++ もテンプレートの進化と共にあれこれと複雑な事も出来るようになった。

typename... で可変長のテンプレート変数を受け取り、forward で、そのまま、次の段階にそのまま渡すことが出来る。この例では、move はおまけだが、局所変数として定義した値をそのまま返す。古いバージョンの C++ では局所変数を返すのはコピーコンストラクタが呼ばれる御法度だったが、ムーブセマンテックスにより、それらも回避できる様になり軽量になった。

#include <iostream>

template< typename T, typename... Ts >
T emplace( Ts&&... args )
{
    T value( std::forward< Ts >( args )... );
    std::cout << value << std::endl;
    return std::move( value );
}

int main()
{
    float f = emplace< float >( 3.14 );
    int i = emplace< int >( 3.14 );
    std::string s = emplace< std::string >( 3, 'a' );
}
emplace は可変長の変数を受け取り、全ての引数をそれぞれのコンストラクタに丸無げする。
% c++ -std=c++11 forward-move.cpp
% ./a.out 
3.14
3
aaa
string 型は、二つの引数を渡し、a を三回設定している。