根据给定的 typedef 调用 std::to_string 或 std::to_wstring
Calling std::to_string or std::to_wstring based on given typedef
在一个库中,我在内部使用以下形式的 typedef:
using AnsiChar = char;
using WideChar = wchar_t;
一个全局类型定义,基本上存储了整个库中要使用的特定平台char
,定义如下:
// Either
using Char = AnsiChar;
// or
using Char = WideChar;
// depending on the platform this code is being compiled on
在代码中的某个时刻,我想根据当前的 Char
类型调用 std::to_string
或 std::to_wstring
。我的尝试是这样的:
template <typename TChar = Char, typename T>
typename std::enable_if<std::is_same<TChar, AnsiChar>::value, std::string>::type
ToString(const T& Arg)
{
return std::to_string(Arg);
}
template <typename TChar = Char, typename T>
typename std::enable_if<std::is_same<TChar, WideChar>::value, std::wstring>::type
ToString(const T& Arg)
{
return std::to_wstring(Arg);
}
这是实现条件函数的正确方法,还是推荐使用其他方法来实现?
EDIT. 作为旁注,我正在考虑使用像 std::basic_string<Char>
这样的函数指针作为 return 类型来概括这个和然后以某种方式有条件地将 std::to_string
或 std::to_wstring
中的任何一个绑定到指针。
template<class Char>
struct string_traits;
template<>
struct string_traits<char>{
using string=std::string;
template<class T>
static string convert_to_string(T&& t){
using std::to_string;
return to_string(std::forward<T>(t));
}
};
template<>
struct string_traits<wchar_t>{
using string=std::wstring;
template<class T>
static string convert_to_string(T&& t){
using std::to_wstring;
return to_wstring(std::forward<T>(t));
}
};
现在您的代码很简单
template <typename TChar = Char, typename T>
std::basic_string<TChar>
ToString(const T& Arg) {
return string_traits<TChar>::convert_to_string(Arg);
}
在一个库中,我在内部使用以下形式的 typedef:
using AnsiChar = char;
using WideChar = wchar_t;
一个全局类型定义,基本上存储了整个库中要使用的特定平台char
,定义如下:
// Either
using Char = AnsiChar;
// or
using Char = WideChar;
// depending on the platform this code is being compiled on
在代码中的某个时刻,我想根据当前的 Char
类型调用 std::to_string
或 std::to_wstring
。我的尝试是这样的:
template <typename TChar = Char, typename T>
typename std::enable_if<std::is_same<TChar, AnsiChar>::value, std::string>::type
ToString(const T& Arg)
{
return std::to_string(Arg);
}
template <typename TChar = Char, typename T>
typename std::enable_if<std::is_same<TChar, WideChar>::value, std::wstring>::type
ToString(const T& Arg)
{
return std::to_wstring(Arg);
}
这是实现条件函数的正确方法,还是推荐使用其他方法来实现?
EDIT. 作为旁注,我正在考虑使用像 std::basic_string<Char>
这样的函数指针作为 return 类型来概括这个和然后以某种方式有条件地将 std::to_string
或 std::to_wstring
中的任何一个绑定到指针。
template<class Char>
struct string_traits;
template<>
struct string_traits<char>{
using string=std::string;
template<class T>
static string convert_to_string(T&& t){
using std::to_string;
return to_string(std::forward<T>(t));
}
};
template<>
struct string_traits<wchar_t>{
using string=std::wstring;
template<class T>
static string convert_to_string(T&& t){
using std::to_wstring;
return to_wstring(std::forward<T>(t));
}
};
现在您的代码很简单
template <typename TChar = Char, typename T>
std::basic_string<TChar>
ToString(const T& Arg) {
return string_traits<TChar>::convert_to_string(Arg);
}