Метод как параметр по умолчанию для метода
В настоящее время я работаю над Set-классом для курса C++, который является производным от vector<T>
,
В какой-то момент я пришел к тому, что мне нужно было реализовать функцию под названием index()
который, очевидно, будет возвращать (если набор содержит его) индекс объекта в этом наборе. При написании всего класса я пришел к тому, что мне нужно перегрузить эти index()
метод, который где оба публичный. Итак, вот мои два типа методов:
1-й. с 3 параметрами:
size_t index ( T const& x,size_t const& l, size_t const& r) const
{
if(l > size()||r>size())
throw("Menge::index(): index out of range.");
//cut the interval
size_t m = (l+r)/2;
// x was found
if( x == (*this)[m])
return m;
// x can't be found
if( l==m)
return NPOS;
//rekursive part
if( x < (*this)[m])
return index(l,m,x);
return index(m+1,r,x);
}
2-й с одним параметром:
bool contains ( T const& elem ) const{
return index(elem, 0, size()-1)!=NPOS;
}
Дело в том, что я не хочу писать эти 2 метода, они могут быть объединены в один, если это возможно. Я думал о значениях по умолчанию для index()
метод, так что я бы написал метод-наподобие:
size_t index (T const& x, size_t const& l=0, size_t const& r=size()-1)const;
который дал мне ошибку:Elementfunction can't be called without a object
Подумав об этой ошибке, я попытался отредактировать ее в:
size_t index (T const& x, size_t const& l=0, size_t const& r=this->size()-1)const;
Но это дало мне ошибку: You're not allowed to call >>this<< in that context.
Может быть, я что-то пропустил, но, пожалуйста, дайте мне знать, если кто-нибудь из вас может сказать мне, можно ли вызвать метод в качестве параметра по умолчанию или нет.
1 ответ
Вы не можете использовать this
при определении аргументов по умолчанию.
Указатель this не допускается в исходных аргументах по умолчанию.
Обычный способ добиться этого - предоставить перегрузку с меньшим количеством аргументов, что соответствует исходной ситуации, которой вы избегали.
size_t index ( T const& x,size_t const& l, size_t const& r) const;
size_t index ( T const& x ) const {
index( x, 0, size() - 1 );
}
В качестве альтернативы вы можете рассмотреть назначение магического числа в качестве аргумента по умолчанию, который вы можете проверить в своей реализации.
#include <limits>
constexpr size_t magic_number = std::numeric_limits<size_t>::max();
size_t index ( T const & x, size_t l = 0, size_t r = magic_number) const
{
if(r == magic_number) {
r = size() - 1;
}
// Actual implementation
}