2016-06-29 6 views
0

私はテンプレートの引数によって型が決まるメンバ変数を持つ次のクラステンプレートを持っています。コンストラクタでこのメンバの値を初期化したいだけです。コンストラクタの値はstd::stringです。したがって、私の問題は、std::stringをいくつかのタイプ(intdoubleboolstring)に変換する必要があるということです。私はコンストラクタだけを専門にすることはできないと思っています。クラスごとにクラスごとに特化しない方がいいでしょう。std :: stringをコンストラクタのいくつかの型に変換するには?

#include <iostream> 
#include <string> 
#include <sstream> 

using namespace std; 

template <typename Ty> 
struct Test 
{ 
    Ty value; 

    Test(string str) { 
     stringstream ss; 
     ss.str(str); 
     ss >> value; 
    } 
}; 


int main() 
{ 
    Test<int> t1{"42"}; 
    Test<double> t2{"3.14159"}; 
    Test<string> t3{"Hello world"}; 

    cout << t1.value << endl << t2.value << endl << t3.value << endl; 

    return 0; 
} 

上記のコードの出力は次のとおりです:

代わりに「Hello World」の
42 
3.14159 
Hello 

以下の私のコードの問題は、それがスペースを打つときstringstream停止が出ストリーミングということです。 stringstreamを空白や他のデバイスで停止しないようにする方法はありますか?

+1

[Boost.Lexical_Cast](http://www.boost.org/doc/libs/1_61_0/doc/html/boost_lexical_cast.html)をご覧になることをお勧めします。 –

答えて

1

これは私のために働く。ただ、一般的な実装の前に特別な実装を宣言します。ここでは

#include <iostream> 
#include <string> 
#include <sstream> 

template<typename T> 
struct Test { 
    T value; 
    Test(std::string); 
}; 

template<> 
inline Test<std::string>::Test(std::string str) { 
    value = str; 
} 

template<typename T> 
inline Test<T>::Test(std::string str) { 
    std::stringstream ss; 
    ss.str(str); 
    ss >> value; 
} 

int main() { 
    Test<int> t1{"42"}; 
    Test<double> t2{"3.14159"}; 
    Test<std::string> t3{"Hello world"}; 

    std::cout 
     << t1.value << std::endl 
     << t2.value << std::endl 
     << t3.value << std::endl; 

    return 0; 
} 

ideone実施例です。

+0

ちょっと、これはうまくいきます。クラス全体を専門にせずにコンストラクタを専門にすることができるかどうかは分かりませんでした。キーは、クラス内のコンストラクタをまったく定義していません。一般的なケースとスペシャライゼーションはすべて外に出ます。副次的なことに、クラス外での専門化の結果、複数の定義エラーを避けるために、私のコンストラクタの両方のバージョンに 'inline'をマークしなければなりませんでした。 – Carlton

+0

ヘッダーに定義されている場合は、そうする必要があります。私は私の答えを更新します。また、いくつかのコンパイラは特殊な定義の前に 'template <>'(おそらくC++ 14)を必要としているので、それも更新します。 – Assimilater

+0

はい、GCC 4.9.3は 'template <>'を必要としました。言及を忘れてしまった。 – Carlton

関連する問題