在一个库中,我在内部使用以下形式的typedef:

using AnsiChar = char;
using WideChar = wchar_t;

如下定义一个全局typedef,该类型基本上存储要在整个库中使用的特定于平台的char:

// Either
using Char = AnsiChar;
// or
using Char = WideChar;
// depending on the platform this code is being compiled on

在代码中的某个时刻,我想根据当前std::to_string类型调用std::to_wstringChar。我的尝试如下所示:

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);
}

这是实现条件函数的正确方法,还是建议使用其他任何方法来实现此功能?

编辑。作为附带说明,我正在考虑使用诸如std::basic_string<Char>之类的函数指针作为返回类型来泛化此函数指针,然后以某种方式有条件地将std::to_stringstd::to_wstring绑定(bind)到指针。

最佳答案

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);
}

08-27 00:58
查看更多