是的 - 回到 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 代码逆向工程的,而不是我从公司代码库创建并投入生产的版本。不过,我现在想不出我对它所做的任何其他重大修改。