用const限定符替换方法替换(C ++)

时间:2014-09-19 14:23:34

标签: c++ pointers const member

假设我们需要实例化一个从非平凡代码中调用某个类方法的函数。

#include <iostream>

class A
{
public:
   int f() { return 1; }
   int g() { return 2; }
};

template <class T, int (T::*method)()>
int func(T& x)
{
   // some complex code here calling method()
   return (x.*method)();
}

int main()
{
   A a;
   std::cout << func<A, &A::f>(a) << "\n"
             << func<A, &A::g>(a) << "\n";
   return 0;
}

此代码编译并正常工作。现在假设这两个方法实际上是const和非const,如下所示:

class A
{
   int val_;
public:
   A() : val_(0) {}
   int alloc() { return ++val_; }
   int get() const { return val_; }
};

这次我们不能使用相同的方法,因为成员函数由于const限定符而具有不同的签名。将问题移动到运行时似乎没有解决任何问题,有没有办法避免在这种情况下将func()重写为两个函数?

1 个答案:

答案 0 :(得分:1)

您可以将传递方法从模板参数更改为函数参数吗? 如果是,这可行:

#include <iostream>

class A
{
public:
   int f() { return 1; }
   int g() const { return 2; }
};

template <class T, class F>
int func(F method, T& x)
{
   // some complex code here calling method()
   return (x.*method)();
}

int main()
{
   A a;
   std::cout << func(&A::f, a) << "\n"
             << func(&A::g, a) << "\n";
   return 0;
}