Я пишу шаблонный класс и хочу, чтобы дополнительный метод существовал только для определенного типа шаблона. В настоящее время этот метод существует для всех типов шаблонов, но вызывает ошибку компиляции для всех других типов.
Сложность заключается в том, что это перегруженный оператор (). Не уверен, что здесь возможно то, что я хочу сделать.
Вот что у меня есть:
template<typename T, typename BASE>
class MyClass : public BASE
{
public:
typename T& operator() (const Utility1<BASE>& foo);
typename T const& operator() (const Utility2<BASE>& foo) const;
};
Я хочу, чтобы всегда была доступна версия T &
, но версия T const &
доступна, только если Utility2
действительна. Прямо сейчас существуют оба метода, но попытка использовать версию const дает странную ошибку компиляции, если Utility2
недопустима. Я бы предпочел иметь разумную ошибку или даже ошибку «нет такой функции-члена».
Возможно ли это?
РЕДАКТИРОВАТЬ : После прочтения документации по ускорению, вот что я придумал , и, похоже, он работает:
template<typename T, typename BASE>
class MyClass : public BASE
{
public:
typename T& operator() (const Utility1<BASE>& foo);
template<typename U>
typename boost::enable_if<boost::is_same<Utility2<BASE>, U>, T>::type const &
operator() (const U& foo) const;
};
Таким образом, этот метод не существует, если кто-то не пытается использовать его с Utility2, и они могут создать Utility2, только если он действителен для этого типа BASE. Но когда это недопустимо для этого типа BASE, MyClass не будет тратить время на создание метода доступа.