Невозможно определить const
функций-членов. Однако использование ссылок пересылки позволяет определить cost
аргументы функции. Таким образом, вы можете просто делегировать функции, принимая тип объекта в качестве аргумента и передавая все остальные аргументы. Таким образом, дублированный код становится тривиальным. Если функции нужен доступ к private
или protected
членам, вы просто сделаете ее (вероятно, private
) static
членом:
template <typename T, bool PM = true>
class Frame {
template <typename F1, typename F2>
static void iterateTogether(F1&& f1, F2&& f2) {
// actual implementation goes here
}
public:
template <typename F2>
void iterateTogether(F2&& other){
iterateTogether(*this, std::forward<F2>(other));
}
// ...
};
Реализация, использованная выше, также позволяет различать const
ness параметра. Если вы хотите ограничить параметр на самом деле просто специализацией Frame
, вам нужно ограничить функцию, которая, однако, легко выполняется.
Мое личное предпочтение - иметь в любом случае только тривиальные члены и делегировать все нетривиальные универсальным алгоритмам. Я предпочитаю, чтобы классы просто сохраняли свои инварианты, а интересные применения реализованы с помощью алгоритмов.