如何从构造函数传递给作为成员函数的谓词

Oop*_*ser 4 c++ sorting constructor pointers

我有以下代码:

template <class T>
class GenericGeneticSolver
{
public:
    GenericGeneticSolver(IGenticSolverHelper<T>& helper, int generationSize) : mSolverHelper(helper), mGenerationSize(generationSize)
    {
        mCurrentGeneration.resize(mGenerationSize);
        for(int i=0;i<mGenerationSize;i++)
        {
            mSolverHelper.GenerateRandomSolution(mCurrentGeneration[i]);
        }

        sort(mCurrentGeneration.begin(),mCurrentGeneration.end(), solutionComparer);
    }
    void Evolve(int numberOfGenerations = 1)
    {
        //sort(mCurrentGeneration.begin(),mCurrentGeneration.end(), solutionComparer);
    }
private :
    int mGenerationSize;
    vector<T> mCurrentGeneration;
    IGenticSolverHelper<T>& mSolverHelper;

    bool solutionComparer (T first,T second) { return (mSolverHelper.Cost(first)<mSolverHelper.Cost(second)); }
};
Run Code Online (Sandbox Code Playgroud)

constructor我用成员填充向量,然后我试图通过将谓词传递给Sort函数来对该向量进行排序,谓词是一个名为`solutionComparer的成员函数.

不幸的是它没有编译,编译器不满意在构造函数中使用指向成员函数的指针,我在"Evolve"函数中尝试了相同的行,并且它确实编译.

我得到的错误是:

error C3867: 'GenericGeneticSolver<T>::solutionComparer': function call missing argument list; use '&GenericGeneticSolver<T>::solutionComparer' to create a pointer to member
Run Code Online (Sandbox Code Playgroud)

我试图做错误建议但它也没有编译(sort函数中的一些随机错误).

为什么我不能在构造函数中使用指向成员函数的指针?

Mik*_*our 15

std::sort需要一个可以简单称为的比较器compare(a,b).一个(指向一个)成员函数的指针是不合适的,因为它需要一个对象被调用,所以你需要一个包装器将成员函数绑定到一个对象,并使它只用两个要比较的值来调用它.

在C++ 11中,您可以将成员函数绑定到对象:

sort(mCurrentGeneration.begin(),mCurrentGeneration.end(),
    std::bind(&GenericGeneticSolver::solutionComparer, this, 
         std::placeholders::_1, std::placeholders::_2));
Run Code Online (Sandbox Code Playgroud)

或者你可以使用lambda:

sort(mCurrentGeneration.begin(),mCurrentGeneration.end(),
    [this](T first,T second) { return solutionComparer(first, second); });
Run Code Online (Sandbox Code Playgroud)

从历史上看,你必须制作自己的仿函数,可能是这样的:

struct SolutionComparer {
    IGenticSolverHelper<T>* helper;

    SolutionComparer(IGenticSolverHelper<T>& helper) : helper(&helper) {}

    bool operator()(T first,T second) {
        return helper->Cost(first) < helper->Cost(second);
    }
};

sort(mCurrentGeneration.begin(),mCurrentGeneration.end(),
    SolutionComparer(mSolverHelper));
Run Code Online (Sandbox Code Playgroud)