从const到非const版本的指向成员函数的指针的模板参数推导

时间:2012-02-10 13:56:09

标签: c++ templates

我有这样的代码:

#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不存在时,它也会受到赞赏。

1 个答案:

答案 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;
}