Например, у меня есть класс
// 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();
}
};
Хотите создать более читаемый код. Любой хороший дизайн, чтобы явно дать пользователю знать требование параметра шаблона?
В 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’
Других решений пока нет …