2

私はテンプレート クラスを持っています。唯一のテンプレート パラメーターは typename です。

template<typename T>
class Reader{
    ...
}

今、次のようなすべての整数型に特化したいと思います。

template<typename T - integral>
class Reader{
    //another code
}

どうすればこれを達成できますか?

4

3 に答える 3

5

追加のデフォルトのブール値パラメーターのみを使用できます。

template<typename T, bool IsIntegral = std::is_integral<T>::value>
class Reader{ // primary template, used for non-integrals
    ...
}

template<typename T>
class Reader<T, true> { // specialization for integral types
    ...
}
于 2012-09-17T21:23:46.230 に答える
3

同様の状況で、私はすべての特殊なタイプにクラステンプレートを特殊化するというブルートフォースアプローチを使用しました。これらはかなりの数であり、すぐにかなり苦痛になる可能性があることを私は理解しています。ただし、すべての専門分野で共有される基本クラスに興味深いメンバーを因数分解することは、かなりうまく機能します。このアプローチを使用した場合、通常、クラスには静的メンバーしかありませんでした。つまり、コンストラクターが継承されないという事実は問題ではありませんでした(C ++ 2011はコンストラクターも継承する構文をサポートしていますが、whileポイントは表記ダウン):

template <typename T> class Reader { ... };

template <typename T> class IntReader { /* special version for integers */ };
// to bool or not bool?
template <> class Reader<wchar_t>: public IntReader<wchar_t> {};
template <> class Reader<char>: public IntReader<char> {};
template <> class Reader<char16_t>: public IntReader<char16_t> {};
template <> class Reader<char32_t>: public IntReader<char32_t> {};
template <> class Reader<signed char>: public IntReader<signed char> {};
template <> class Reader<signed short>: public IntReader<signed short> {};
template <> class Reader<signed int>: public IntReader<signed int> {};
template <> class Reader<signed long>: public IntReader<signed long> {};
template <> class Reader<signed long long>: public IntReader<signed long long> {};
template <> class Reader<unsigned char>: public IntReader<unsigned char> {};
template <> class Reader<unsigned short>: public IntReader<unsigned short> {};
template <> class Reader<unsigned int>: public IntReader<unsigned int> {};
template <> class Reader<unsigned long>: public IntReader<unsigned long> {};
template <> class Reader<unsigned long long>: public IntReader<unsigned long long> {};

確かに、整数型が多すぎます!6つの異なるキャラクタータイプを持つのはちょっとばかげています。

于 2012-09-17T23:54:14.743 に答える
2

ダミーstd::true_typeパラメータを使用できます

template<typename T, typename = std::true_type>
class Reader {

};

template<typename T>
class Reader<T, std::integral_constant<bool, 
                  std::is_integral<T>::value> > {
  // ...
};

ちなみに、このパターンはvoidの代わりに使用され、特殊化はより複雑な (および SFINAE を含む) 条件をtrue_type使用することがよくあります。enable_if

于 2012-09-18T18:18:31.837 に答える