#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;
}
ICAgICNpbmNsdWRlIDxpb3N0cmVhbT4KCiAgICBzdHJ1Y3QgVGVzdGVyIHsKICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgRlQ+CiAgICAgICAgdm9pZCBvcGVyYXRvcigpKCBjb25zdCBGVCAmIChUOjoqcHRyKSgpIGNvbnN0ICkgY29uc3QKICAgICAgICB7CiAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAiY29uc3QgZXhpc3RzIiA8PCBzdGQ6OmVuZGw7CiAgICAgICAgfQoKICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgRlQ+CiAgICAgICAgdm9pZCBvcGVyYXRvcigpKCBGVCAmIChUOjoqcHRyKSgpICkKICAgICAgICB7CiAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAibm9uLWNvbnN0IGV4aXN0cyIgPDwgc3RkOjplbmRsOwogICAgICAgIH0KICAgIH07CgoKICAgIHN0cnVjdCBBIHsKICAgICAgICBjb25zdCBkb3VibGUgJiBhKCkgY29uc3QgeyByZXR1cm4gYV87IH0KICAgICAgICBkb3VibGUgJiBhKCkgeyByZXR1cm4gYV87IH0KCiAgICAgICAgcHJpdmF0ZToKICAgICAgICAgICAgZG91YmxlIGFfOwogICAgfTsKCiAgICBzdHJ1Y3QgQiB7CiAgICAgICAgY29uc3QgZG91YmxlICYgYigpIGNvbnN0IHsgcmV0dXJuIGJfOyB9CgogICAgICAgIHByaXZhdGU6CiAgICAgICAgICAgIGRvdWJsZSBiXzsKICAgIH07CgoKCiAgICBpbnQgbWFpbiggaW50IGFyZ2MsIGNoYXIgKiphcmd2ICkKICAgIHsKICAgICAgICBUZXN0ZXIgdDsKICAgICAgICB0KCZBOjphKTsKICAgICAgICB0KCZCOjpiKTsKCiAgICAgICAgcmV0dXJuIDA7CiAgICB9