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)