拡張関数がnon-constとconstの両方に適切に一致する可変個引数テンプレートを作成するのに問題がありますstd::string
。代わりに呼び出される一般的なマッチング関数があります。
コードを以下の例に減らしました。文字列ではないものは、ジェネリック関数で終わるはずです。文字列であるものは、さらに「STRING」を出力する2番目の関数で終わるはずです。
#include <iostream>
#include <string>
template<typename X, typename T>
void extend_exception( X & ex, T&& value )
{
ex << value << std::endl;
}
template<typename X>
void extend_exception( X & ex, std::string && value )
{
ex << "STRING: " << value << std::endl;
}
template<typename X, typename TF, typename ... TR>
void extend_exception( X & ex, TF&& f, TR&& ... rest )
{
extend_exception( ex, std::forward<TF>(f) );
extend_exception( ex, std::forward<TR>(rest)... );
}
int main()
{
extend_exception( std::cout, std::string( "Happy" ) );
std::string var( "var" );
extend_exception( std::cout, var );
extend_exception( std::cout, var, std::string( "Combo" ), const_cast<std::string const&>(var));
return 0;
}
上記のバージョンでは、2つのvar
使用法は文字列関数に渡されません。パラメータを指定する他のさまざまな方法を試しましたが、どれもうまくいかないようです:std::string && value
、、。また、const以外の文字列は一致しましたが、constの文字列は一致しませんでした。これにより、少なくとも2つの異なる機能を使用することで回避策が得られますが、これを行う必要はないと思います。std::string const & value
std::string const && value
std::string & value
const、non-const、および一時的な文字列オブジェクトに対して呼び出される単一の関数をここに作成するにはどうすればよいですか?
g++4.6.3を使用しています