如何在模板 class 方法中将方法指针作为参数传递

How to pass method pointer as argument in template class method

我正在为不同类型创建容器模板。其中一种类型将 shared_ptr 反对。因此,为了避免操作数 ->. 的重复代码调用对象方法,我试图将指针作为函数参数传递给方法,但出现此错误:

error: invalid use of non-static member function 'void A::show()'
 { doOperation(U::show); }

代码:

template <typename T, typename U>
class MepVector
{
private:
    typedef void(U::*Operation)();
public:
    MepVector() {}

    void doOperation(Operation operation)
    {
        for(const auto& t : mepVector_)
        {
            (t.*operation)();
        }
    }

    void add(T t)
    { mepVector_.push_back(t); }

    void show()
    { doOperation(U::show); }


private:
    std::vector<T> mepVector_;
};

class A
{
    public:
    A() {};
    void show()
    { cout<<"udalo sie!"<<endl; }
};

int main() {
    MepVector<A,A> myVector;

    myVector.add(A());

    myVector.show();

    return 0;
}

我不想A::show() static.

首先,您必须明确获取 U::show - doOperation(&U::show); 的地址。编译器认为您正在尝试使用该函数,就好像它是 static.

其次,您试图用 const auto& t 调用 (t.*operation)();,而 A::show 没有 const 限定符。将 A::showOperation typedef const 一起制作或使用 auto& t.

改为:

void show()
{ doOperation(&U::show); }

但是,您还有第二个问题:

    for(const auto& t : mepVector_)
    {
        (t.*operation)();
    }

因为 operation 是指向可变 class 实例函数的指针,所以必须将其更改为:

    for(auto& t : mepVector_)
    {
        (t.*operation)();
    }

或者,Operation需要相应地重新定义:

typedef void(U::*Operation)() const;

连同 A::show 也是一个 const 方法函数:

void show() const
{  }