1

C ++テンプレート関数を作成するときに、この関数で使用される変数の型が整数であることを確認する必要があります。その場合は、コンパイルエラーが発生するはずです。

template <class IT> void foo( IT first, IT last ) {
    // check here that *first has integral type.
}

私が抱えている問題は、この関数テンプレートパラメータが直接使用される型ではなく、イテレータ型であるということです。

残念ながら、私は現在C ++ 11もBoostも使用できない環境にいるので、このホイールを自分で作り直さなければなりません。

配列サイズのパラメーターを使用して配列へのポインターを定義することにより、型が整数であることをテストすることになりました。パラメータタイプが非整数の場合、これはコンパイルエラーを生成します。

template <class IT> void foo( IT first, IT last ) {
    int ( * fake_array_ptr )[*first]; // Error: size of array has non-integral type
}

私の質問は、型が整数であるかどうかをテストする他のより明確な方法はありますか?

4

1 に答える 1

3

配列サイズのパラメーターを使用して配列へのポインターを定義することにより、型が整数であることをテストすることになりました。パラメータタイプが非整数の場合、これはコンパイルエラーを生成します。

これは移植性がありません。配列サイズは整数定数式でなければならないため、パラメータタイプが整数であっても、コンパイルエラーが発生する可能性があります。コンパイラには拡張機能としてC99可変長配列があり、デフォルトで有効になっているため、おそらく現在コンパイルされています。

ポータブル整数型の数には限りがあります。これらのそれぞれに対する明示的な特殊化はis_integral、C++03で実装するための移植可能な方法です。

template <typename T>
struct is_integral { static const bool value = false; };

template <>
struct is_integral<char> { static const bool value = true; };

template <>
struct is_integral<signed char> { static const bool value = true; };

template <>
struct is_integral<unsigned char> { static const bool value = true; };

template <>
struct is_integral<short> { static const bool value = true; };

// and so on

template <>
struct is_integral<unsigned long> { static const bool value = true; };

このトレイトがfalseを生成するときにコンパイルエラーを発生させるにはstatic_assert、C++11またはで使用しBOOST_STATIC_ASSERTます。自分で実装する方法BOOST_STATIC_ASSERTについての前の質問があります。

于 2013-03-27T10:50:52.750 に答える