Так что это очень незначительная вещь. Это меня не особо привлекает. Но это было опрятно.
у шаблонный класс и хочу, чтобы дополнительный метод существовал только для определенного типа шаблона. В настоящее время метод существует для всех типов шаблонов, но вызывает ошибку компиляции для всех других типов.
Сложность в том, что это перегруженный оператор (). Не уверен, что то, что я хочу сделать, действительно возможно здесь.
Вот что у меня сейчас:
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 не будет тратить время на создание метода доступа.