どのように書いていの機能をテンプレートのためのすべての種類の特定の種類の形質?

StackOverflow https://stackoverflow.com/questions/2537229

  •  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>
{
};
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top