ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

c-如何从构造函数传递排序谓词,即成员函数

2019-10-11 03:10:00  阅读:170  来源: 互联网

标签:c sorting pointers constructor


我有以下代码:

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)); }
};

在构造函数中,我用成员填充向量,然后尝试通过将谓词传递给Sort函数对该向量进行排序,该谓词是一个称为`solutionComparer的成员函数.

不幸的是,它无法编译,编译器对在构造函数中使用指向成员函数的指针不满意,我在“ Evolve”函数中尝试了同一行,并且可以编译.

我得到的错误是:

error C3867: 'GenericGeneticSolver<T>::solutionComparer': function call missing argument list; use '&GenericGeneticSolver<T>::solutionComparer' to create a pointer to member

我尝试执行错误所建议的操作,但均未编译(排序函数中的一些随机错误).

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

解决方法:

std :: sort需要一个比较器,可以简单地称为compare(a,b). (指向a的)成员函数不合适,因为它需要调用一个对象,因此您需要一个包装器将成员函数绑定到一个对象,并使它仅可通过两个值进行比较来进行调用.

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

sort(mCurrentGeneration.begin(),mCurrentGeneration.end(),
    std::bind(&GenericGeneticSolver::solutionComparer, this, 
         std::placeholders::_1, std::placeholders::_2));

或者您可以使用lambda:

sort(mCurrentGeneration.begin(),mCurrentGeneration.end(),
    [this](T first,T second) { return solutionComparer(first, second); });

从历史上看,您可能必须按照以下方式制造自己的函子:

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));

标签:c,sorting,pointers,constructor
来源: https://codeday.me/bug/20191011/1889303.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有