2016-04-12 23 views
5

タイトルは本当にすべてです。なぜ彼らは持っていないのですか?std :: to_stringのstd :: stringのオーバーロードがなぜ発生しないのですか

namespace std 
{ 
    std::string to_string(const std::string&) 
} 

過負荷ですか?

私はいくつかのデータを行インデックスまたは行名で照会できるプログラムを持っています。テンプレートに最適です。アクセスされている行が欠落している場合、私はエラーメッセージを作成しようとするまで:

template <typename T> 
int read(T nameOrIndex) 
{ 
    if (!present(nameOrIndex)) 
    { 
     // This does not compile if T is std::string. 
     throw std::invalid_argument("Missing row: " + std::to_string(nameOrIndex)); 
    } 
} 

私はstd名前空間に私自身の過負荷を追加できますが、それは理想的ではありません。

+2

見落としの可能性があります。 –

+4

'T 'も他の型もあれば、あなたのコードはコンパイルされません。それらのすべてはどうですか?任意の型の文字列を返す 'to_string'実装があるでしょうか? 'to_string'オーバーロードを' std'(違法です)に追加するのではなく、 'read'と同じ名前空間に独自の' to_string'オーバーロードを作成します。それから 'std :: to_string'にデリゲートし、' std :: string const& 'をとるオーバーロードからそのまま引数を返します。 – Praetorian

+2

'std :: to_string'は組み込みの数値型を文字列に変換します。文字列であるため文字列に変換する必要はありません。 –

答えて

9

だけではなく、代わりにこれを行う、非常に悪いソリューションですstd名前空間にstd::stringを取って、独自のオーバーロードを定義します。

#include <iostream> 
#include <string> 

std::string to_string(const std::string& value) 
{ 
    return value; 
} 

template <typename T> 
void display(T value) 
{ 
    using namespace std; 
    std::cout << to_string(value) << std::endl; 
} 

int main() 
{ 
    display("ABC"); 
    display(7); 
} 
+0

このコードでは、引数に組み込み型があるため、ADLは使用しません。代わりに、 'display'関数は' std'から名前を持ちます。そのため、修飾されていないルックアップはルックアップ・セットに 'std :: to_string'と' :: to_string'の両方を持ちます。 –

1

を私が過負荷でない理由を推測するつもりはありません標準的なライブラリですが、ここでは簡単なソリューションを使用することができます。 std::to_stringの代わりにboost::lexical_castを使用してください。

template <typename T> 
int read(T nameOrIndex) 
{ 
    if (!present(nameOrIndex)) 
    { 
     throw std::invalid_argument { 
      "Missing row: " + boost::lexical_cast<std::string>(nameOrIndex) 
     }; 
    } 
    // … 
} 

ブースト依存関係が必要ない場合は、簡単に独自の関数をロールバックできます。

template <typename T> 
std::string 
to_string(const T& obj) 
{ 
    std::ostringstream oss {}; 
    oss << obj; 
    return oss.str(); 
} 

明らかに最適化されていませんが、あなたのケースには十分な可能性があります。

関連する問題