10

就職の面接で、型がポインタかどうかを判断するメタ関数を書くように言われました。これは私が提示したものです:

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

template <typename T>
struct is_pointer<T *>
{ static const bool value = true; }

次に、メタアサートを作成するように求められました。これは、is_pointer関数が正しいことをしていない場合にコンパイル時に失敗します。

私が を使用したときstatic_assert、彼は私が C++98 標準のみを使用してもよいと明示的に言いました。どうすればこれを達成できますか?

4

3 に答える 3

5

あなたの場合

template <bool> struct assert;
template <> struct assert<true> {};

問題を解決したでしょう:

assert<!is_pointer<char>::value>();     // valid
assert<is_pointer<char *>::value>();    // valid

assert<is_pointer<char>::value>();      // compilation error:
                                        // use of incomplete class
于 2013-07-23T17:26:05.617 に答える
3

私は使用しますBOOST_STATIC_ASSERT。コードを見ることができます: boost/static_assert.hpp

アイデアを提供するために、非常に単純化されたバージョンを次に示します。

#define JOIN(X, Y) DO_JOIN(X, Y)
#define DO_JOIN(X, Y) X ## Y

template<bool cond>
struct Static_assert_helper;  // incomplete type

template<>
struct Static_assert_helper<true> {
    typedef int Type;
};

#define STATIC_ASSERT(cond) \
    typedef Static_assert_helper<(cond)>::Type JOIN(Static_assert_typedef_, __LINE__)

多くの場所で使用できます (例についてはドキュメントを参照してください)。

(Boost の実装はより完全で、たとえば asizeofと中間構造体を使用して、より適切なエラー メッセージを表示し、さまざまなコンパイラに移植できます。)

于 2013-07-24T10:06:33.473 に答える