Могу ли я использовать boost :: enable_if для функции-члена?

Я пишу шаблонный класс и хочу, чтобы дополнительный метод существовал только для определенного типа шаблона. В настоящее время этот метод существует для всех типов шаблонов, но вызывает ошибку компиляции для всех других типов.

Сложность заключается в том, что это перегруженный оператор (). Не уверен, что здесь возможно то, что я хочу сделать.

Вот что у меня есть:

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 не будет тратить время на создание метода доступа.

7
задан Tim 3 February 2011 в 00:29
поделиться