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 を三回設定している。

コメント

コメントをどうぞ

※メールアドレスとURLの入力は必須ではありません。 入力されたメールアドレスは記事に反映されず、ブログの管理者のみが参照できます。

※なお、送られたコメントはブログの管理者が確認するまで公開されません。

名前:
メールアドレス:
URL:
コメント:

トラックバック

このエントリのトラックバックURL: http://uyota.asablo.jp/blog/2021/03/16/9357616/tb

※なお、送られたトラックバックはブログの管理者が確認するまで公開されません。