C++ の forward と move を使って emplace を再実装した例 ― 2021年03月16日 12時14分00秒
typename...
で可変長のテンプレート変数を受け取り、forward で、そのまま、次の段階にそのまま渡すことが出来る。この例では、move はおまけだが、局所変数として定義した値をそのまま返す。古いバージョンの C++ では局所変数を返すのはコピーコンストラクタが呼ばれる御法度だったが、ムーブセマンテックスにより、それらも回避できる様になり軽量になった。
emplace は可変長の変数を受け取り、全ての引数をそれぞれのコンストラクタに丸無げする。
#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' );
}
string 型は、二つの引数を渡し、a を三回設定している。
% c++ -std=c++11 forward-move.cpp
% ./a.out
3.14
3
aaa
最近のコメント