0

たとえば、私はクラスを持っています

// Require T has method T::A(arguments), T::B(arguments), since they will
// be used in the class template.
template<class T>
class Foo
{
    void Fun()
    {
        mT.A();
        mT.B();
    }
};

より読みやすいコードを生成したい。ユーザーにテンプレート パラメータの要件を明示的に知らせる良い設計はありますか?

4

1 に答える 1

1

C++11 では、この回答static_assertと組み合わせて、より有用なコンパイラ エラー メッセージを提供できます。例えば:

#define HAS_MEM_FUNC(func, name)                                    \
    template <typename T>                                           \
    class name {                                                    \
        typedef char one;                                           \
        typedef long two;                                           \
        template <typename C> static one test( decltype(&C::func)); \
        template <typename C> static two test(...);                 \
    public:                                                         \
        enum { value = sizeof(test<T>(0)) == sizeof(char) };        \
    }

HAS_MEM_FUNC(A, has_A);
HAS_MEM_FUNC(B, has_B);

template<class T>
class Foo
{
public:
    void Fun()
    {
        static_assert(has_A<T>::value,
                      "Template parameter does not contain member function `A`."); 
        static_assert(has_B<T>::value,
                        "Template parameter does not contain member function `B`."); 

        mT.A();
        mT.B();
    }
    T mT;
};

今コード

Foo<int> blah;
blah.Fun();

エラーメッセージが表示されます:

test.cpp:21:9: error: static assertion failed: Template parameter does not contain member function A.
test.cpp:23:9: error: static assertion failed: Template parameter does not contain member function B.
test.cpp:26:9: error: request for member ‘A’ in ‘((Foo<int>*)this)->Foo<int>::mT’, which is of non-class type ‘int’
test.cpp:27:9: error: request for member ‘B’ in ‘((Foo<int>*)this)->Foo<int>::mT’, which is of non-class type ‘int’
于 2013-07-04T19:29:00.207 に答える