Так что это очень незначительная вещь. Это меня не особо привлекает. Но это было опрятно.

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

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

Вот что у меня сейчас:

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<BASE> действует. Сейчас оба метода существуют, но попытка использовать const-версию приводит к странной ошибке компиляции, еслиUtility2<BASE> является недействительным. Я бы предпочел заметную ошибку или даже ошибку "нет такой функции-члена".

Это возможно?

РЕДАКТИРОВАТЬПосле прочтения документации по бусту, вот что я придумала, и, похоже, работает:

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

Ответы на вопрос(1)

Ваш ответ на вопрос