избегать дублирования кода в шаблонных функциях, используемых для различения const и non-const

При написании программы я придумал кусок кода, который мне не удавалось сделать бесплатным дублированием кода.

#include <iostream>

using namespace std;

class Presenter{
public:
template <typename T>
void addField(T& t){
cout << "do something that could happen to modify t" << endl;
}

template <typename T>
void addField(const T& t){
cout << "do something that cannot possibly happen to modify t" << endl;
}
};

class Presented{
public:
Presented() : a(0), b(0.) {}
void bind(Presenter& p){
p.addField(a);
p.addField(b);
//...
}
void bind(Presenter& p) const {
p.addField(a);
p.addField(b);
//...
}
private:
int a;
double b;
//...
};

int main() {
Presenter presenter;
Presented p1;
const Presented p2;
p1.bind(presenter);
p2.bind(presenter);
}

Вот простая фиктивная программа, которая показывает проблему. Как видите, код двух bind функции (выглядит) точно так же. Конечно нет, так как две разные функции (addField), которые используются только для того, чтобы разделить имя.

Тем не менее, я искал способ устранить необходимость дословно написать void bind(Presenter& p) const,

Кто-нибудь видит способ достижения цели? Я не смог придумать один.

3

Решение

Делегировать шаблону, который может быть вызван с помощью const или неконстантного экземпляра Presented:

class Presented{
public:
Presented() : a(0), b(0.) {}
void bind(Presenter& p){
bindImpl(p, *this);

}
void bind(Presenter& p) const {
bindImpl(p, *this);
}
private:
template<typename P>
static void bindImpl(Presenter& p, P& presented)
{
p.addField(presented.a);
p.addField(presented.b);
}

int a;
double b;
};
4

Другие решения

Других решений пока нет …