В следующем классе wrapper
принимает указатель на произвольный метод const
и возвращает результат вызова этого метода с удалением const
. Это можно использовать для генерации соответствующего метода не const
...
struct C {
int x[10];
int const& get(int i) const { return x[i]; }
int const& getr(int const& i) const { return x[i]; }
template<typename T, typename... Ts>
auto& wrapper(T const& (C::*f)(Ts...) const, Ts... args) {
return const_cast<T&>((this->*f)(args...));
}
int& get(int i) { return wrapper(&C::get, i); }
int& getr(int const& i) { return wrapper(&C::getr, i); }
};
почти.
Проблема заключается в том, что окончательный метод getr()
не может быть скомпилирован, потому что список аргументов, переданный в wrapper()
, не подразумевает передачу по ссылке. К тому моменту, когда мы попадаем внутрь wrapper()
, компилятор ищет версию пошагового значения getr()
.
Есть ли уловка?