2017-10-20 165 views
1

给出。在我内部使用以下格式的类型定义库:中调用的std :: to_string或std :: to_wstring基础上的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 

在我想要么调用std::to_stringstd::to_wstring根据当前Char类型代码中的一些点。我的尝试如下所示:

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绑定到指针。

+0

由于呼叫者需要知道返回的字符串类型,你打算如何使用一般这个?你要定义一个通用字符串类型'使用string_type = std :: basic_string ;'?但是这也会影响到其他代码。例如,你将如何'std :: cout'从这些函数之一返回的*字符串*? – Galik

+0

@Galik正如你已经注意到的,我有一个包装类,它有一个'std :: basic_string '成员,基本上我用'ToString(...)。c_str()'提供类,因为它需要一个'const Char *'在它的构造函数中很合适。 –

回答

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

是否有任何特定的原因,你正在写'使用字符串= std :: string' /'使用字符串= std :: wstring'和'使用std :: to_string' /'使用std :: to_wstring'而不是直接内联那些他们只用过一次? –

+0

@ChristianIvicevic前两个用于编写'string_traits :: string'。后两个是ADL。 –

+0

@ChristianIvicevic'string_traits '的使用者可以做'string_traits :: string'并获取它们的字符串类型。 using指令允许你为'foo :: bar'类型写一个'std :: string foo :: to_string(bar const&)','string_traits :: convert_to_string'将自动提取它(ADL)。 – Yakk

相关问题