どのように書いていの機能をテンプレートのためのすべての種類の特定の種類の形質?
-
22-09-2019 - |
質問
次の例を考えてみてください:
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
クラスはエキストークンからのソースです。上記のコードが失敗しよう get
その他の一種のように 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)の文字列です。
解決
struct Scanner
{
template <typename T>
typename boost::enable_if<boost::is_integral<T>, T>::type get()
{
return 10;
}
template <typename T>
typename boost::disable_if<boost::is_integral<T>, std::string>::type get()
{
return "string";
}
};
更新"したい場合はどうすれば受け入れによる授業をもとにかと思う。"
struct Scanner
{
template <typename T>
typename boost::enable_if<boost::is_integral<T>, T>::type get()
{
return 10;
}
template <typename T>
typename boost::enable_if<boost::is_floating_point<T>, T>::type get()
{
return 11.5;
}
template <typename T>
std::string get(
typename boost::disable_if<boost::is_floating_point<T>, T>::type* = 0,
typename boost::disable_if<boost::is_integral<T>, T>::type* = 0)
{
return std::string("string");
}
};
他のヒント
別のテンプレートに
延期。ここで何をしたいのための一般的なパターンがあります:
template <typename T, bool HasTrait = false>
struct scanner_impl;
template <typename T>
struct scanner_impl
{
// Implement as though the trait is false
};
template <typename T>
struct scanner_impl<true>
{
// Implement as though the trait is true
};
// This is the one the user uses
template <typename T>
struct scanner : scanner_impl<T, typename has_my_trait<T>::value>
{
};
所属していません StackOverflow