次の例を検討してください。
struct Scanner
{
template <typename T>
T get();
};
template <>
string Scanner::get()
{
return string("string");
}
template <>
int Scanner::get()
{
return 10;
}
int main()
{
Scanner scanner;
string s = scanner.get<string>();
int i = scanner.get<int>();
}
このScanner
クラスは、何らかのソースからトークンを抽出するために使用されます。上記のコードは問題なく動作しますが、 aや anget
などの他の整数型にしようとすると失敗します。これらの型を読み取るコードは、 を読み取るコードとまったく同じです。読みたい他のすべての整数型のコードを複製することもできますが、すべての整数型に対して 1 つの関数テンプレートを定義したいと思います。char
unsigned int
int
私は次のことを試しました:
struct Scanner
{
template <typename T>
typename enable_if<boost::is_integral<T>, T>::type get();
};
Scanner::get<string>()
これは魅力のように機能しますが、再び機能する方法がわかりません。では、単一の定義ですべての整数型を読み取ることができるように、コードを作成するにはどうすればよいscanner.get<string>()
でしょうか?scanner.get<any integral type>()
更新: おまけの質問: いくつかの特性に基づいて複数の範囲のクラスを受け入れたい場合はどうすればよいですか? たとえば、 get
(i) 整数型 (ii) 浮動小数点型 (iii) 文字列をそれぞれ受け入れる 3 つの関数が必要な場合、この問題にどのようにアプローチすればよいでしょうか。