2017-10-20 6 views
1

のtypedef与えられたに基づいて:呼び出しのstd :: to_stringにまたはのstd :: to_wstring私は内部的に次の形式の型定義を使用していますライブラリで

using AnsiChar = char; 
using WideChar = wchar_t; 

基本的には、プラットフォーム固有のcharされることを保存するグローバルtypedefはライブラリ全体で使用される。このように定義されています。私は現在Charタイプに応じstd::to_stringまたはstd::to_wstringをコールするかしたいコードのある時点で

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

。私の試みは次のようになります:

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>のようなものを使って作業することを検討していましたが、ポインタにstd::to_stringまたはstd::to_wstringのいずれかを条件付きでバインドします。

+0

ているのですか?一般的な文字列型 'string_type = std :: basic_string ;'を定義しようとしていますか?しかし、それはあなたのコードの残りの部分をノックします。例えば、あなたは 'std :: cout'をこれらの関数のどれかから返された*文字列*としますか? – Galik

+0

@Galik気づいたように、私は 'std :: basic_string 'メンバーを持つラッパークラスを持っています。基本的に 'ToString(...)。c_str()'をクラスに提供しています。 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

特別な理由は、 'string = std :: string' /'を使用してstring = std :: wstring'と 'std :: to_string' /' std :: to_wstring'を使用しているのは、彼らは一度だけ使用されますか? –

+0

@ChristianIvicevic前者は 'string_traits :: string'と書いています。後者の2つは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

関連する問題