我有这样的代码:
#include <iostream>
template <typename T, typename FT>
void test( const FT & (T::*ptr)() const )
{
std::cout << "const exists" << std::endl;
}
template <typename T, typename FT>
void test( FT & (T::*ptr)() )
{
std::cout << "non-const exists" << std::endl;
}
struct A {
const double & a() const { return a_; }
double & a() { return a_; }
private:
double a_;
};
struct B {
const double & b() const { return b_; }
private:
double b_;
};
int main( int argc, char **argv )
{
test(&A::a);
test(&B::b);
return 0;
}
使用error message无法编译:
prog.cpp: In function ‘int main(int, char**)’:
prog.cpp:35: error: call of overloaded ‘test(<unresolved overloaded function type>)’ is ambiguous
prog.cpp:4: note: candidates are: void test(const FT& (T::*)()const) [with T = A, FT = double]
prog.cpp:10: note: void test(FT& (T::*)()) [with T = A, FT = double]
很清楚为什么编译器不知道该怎么做。
我的问题是,如果有非const版本,如何用non-const exists
调用一个,如果只有const版本,如何调用const exists
?
注意:对于这个问题,我假设没有const版本就不能存在非const版本。但是,如果你有一个更一般情况的解决方案,当你可以区分非const存在的情况但const不存在时,它也会受到赞赏。
答案 0 :(得分:1)
如此简单的解决方案(ideone):
#include <iostream>
struct Tester {
template <typename T, typename FT>
void operator()( const FT & (T::*ptr)() const ) const
{
std::cout << "const exists" << std::endl;
}
template <typename T, typename FT>
void operator()( FT & (T::*ptr)() )
{
std::cout << "non-const exists" << std::endl;
}
};
struct A {
const double & a() const { return a_; }
double & a() { return a_; }
private:
double a_;
};
struct B {
const double & b() const { return b_; }
private:
double b_;
};
int main( int argc, char **argv )
{
Tester t;
t(&A::a);
t(&B::b);
return 0;
}