うん—この前の答えで探求されたように、Cからの関数にフォールバックします:
namespace boost {
template<>
inline std::string lexical_cast(const int& arg)
{
char buffer[65]; // large enough for arg < 2^200
ltoa( arg, buffer, 10 );
return std::string( buffer ); // RVO will take place here
}
}//namespace boost
理論的には、この新しい特殊化は、それを定義した翻訳ユニットの残りの部分全体で有効になります。文字列ストリームを作成して使用するよりも(非標準でltoa
あるにもかかわらず)はるかに高速です。
ただし、競合する共有ライブラリ間で、この特殊化のインスタンス化と元の関数テンプレートのインスタンス化の間で名前が競合するという問題が発生しました。
これを回避するために、実際にはこの関数にまったく新しい名前を付けています。
template <typename T>
inline std::string fast_lexical_cast(const T& arg)
{
return boost::lexical_cast<std::string>(arg);
}
template <>
inline std::string my_fast_lexical_cast(const int& arg)
{
char buffer[65];
if (!ltoa(arg, buffer, 10)) {
boost::throw_exception(boost::bad_lexical_cast(
typeid(std::string), typeid(int)
));
}
return std::string(buffer);
}
使用法: std::string myString = fast_lexical_cast<std::string>(42);
免責事項:この変更は、会社のコードベースから作成して本番環境に移行したバージョンではなく、 Kirillの元のSOコードからリバースエンジニアリングされています。しかし、私がそれに加えた他の重要な変更については、今のところ考えることができません。