右辺値参照のムーブも共に使って、可変長引数テンプレートを forward する
2020-03-04


C++11 でもう一つ導入された強力なのが、右辺値参照。既に出て、十年近く経過しているので、新しい話題ではないが、可変長引数テンプレートと組み合わせると、更に強力。

右辺値参照は簡単にまとめると、以前は、一時変数を生成してから更にコピーしていたのを、使いきりの一時変数であれば、一時変数をそのまま複製しないで使う機能。その為、余計なコピーコンストラクタを防ぐ事が出来る。

この二つを組み合わせると [LINK]可変長引数テンプレート Variadic Template を Parameter Pack して forward したものを、わざわざ unique_ptr を使わなくても、良くなる。

#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' );
}
これで、一時変数を作り、cout で表示して、そのまま返せる。明示的に std::move を置いたが、これも必要ない用で、処理系で自動で move もするように最適化するらしい。
% c++ -std=c++11 emplace-move.cpp
% ./a.out
3.14
3
aaa
実行結果は前回と同じ。

[LINK]前回。

[Programming]
[C++]

コメント(全0件)
コメントをする


記事を書く
powered by ASAHIネット