В приведенном ниже фрагменте кода я хочу иметь возможность звонить A::foo
из doWork
.
Однако, поскольку есть две перегрузки foo
(const
и не const
)), компилятор не может определить, что я имею в виду при вызове doWork
. Есть ли способ сказать компилятору, что я имел в виду, какой.
Я не могу изменить struct A
.
Могу ли я сделать что-нибудь в подписи doWork или в вызове doWork, чтобы всегда выбирать, скажем, константное.
Одно из известных мне решенийдать тип указателя на функцию в качестве аргумента doWork
вместо шаблона (как это) void doWork(void (A::*fun)(void) const){
Но это немного уродливо, и я хочу найти решение на основе шаблона (если оно существует)
struct A{
void foo() const {
}
void foo(){
}
void bar(){
}
void bar() const {
}
};
template<typename F>
void doWork(F fun){
const A a;
(a.*fun)();
}
int main()
{
doWork(&A::foo); //error: no matching function for call to ‘doWork()’
doWork(&A::bar); // error: no matching function for call to ‘doWork()’
return 0;
}