2017-10-20 95 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

相關問題