2016-05-15 1 views
4

コードを考えてみましょう:テンプレートパラメータを明示的に指定してテンプレートキャスト演算子を呼び出すことはできますか?

#include <string> 
#include <sstream> 

template <class T> 
struct converter_impl { 
    std::string to_convert; 
    operator T() { 
     T result; 
     std::stringstream ss(to_convert); 
     ss >> result; 
     return result; 
    } 
}; 

struct converter { 
    std::string to_convert; 
    template <class T, class CI = converter_impl<T>> 
    operator T() { 
     CI ci = CI{std::move(to_convert)}; 
     return ci; 
    } 
}; 

converter from_string(std::string s) { 
    return converter{std::move(s)}; 
} 

今、私は、例えばすることができます次のようにfrom_string機能を使用します。

string s = "123"; 
int x = from_string(s); 
cout << x << endl; 

私はちょうど好奇心converterが明示的にテンプレートパラメータを指定する構造体のキャスト演算子を呼び出す方法がある場合。構文:

from_string(s).operator int<int, converter_impl<int>>(); 

が...動作しません

答えて

1

あなたはそれがテンプレートされていないかのように、キャスト演算子を呼び出すことができます。

int x = from_string(s).operator int(); 

など、この

int x = from_string(s).template operator int(); 

として、 2番目のテンプレートパラメータを明示的に指定する回避策:

struct converter { 
    std::string to_convert; 
    template <class T, class CI > 
    operator T() { 
     CI ci = CI{std::move(to_convert)}; 
     return ci; 
    } 

    template <class T, class CI> 
    T cast() 
    { 
     CI ci = CI{std::move(to_convert)}; 
     return ci; 
    } 
}; 

とこのようにそれを使用します。

auto y = from_string(s).cast<int, converter_impl<int> >(); 
+0

とても興味深いものでしたが2番目のテンプレートパラメータを渡す方法はありませんか...? –

+1

回避策として、 'struct converter'にテンプレート関数' cast'を追加することができます。そして、暗黙のキャストが可能なときに 'operator T'が呼び出されます。明示的にキャストが必要なときは、あなたの関数を呼び出すことができます。 – user2807083

+0

素晴らしいアイデア!ありがとう! –

関連する問題