动态选择要在std :: map中使用的比较函子

问题描述 投票:0回答:1

我有一组数据,需要根据用户在运行时确定的条件来对其进行排序。

理想情况下,此排序标准必须作为参数传递给函数,例如:

void mainFunction(
    InputData const &inputData,
    OutputData &outputData,
    BaseSortingCriteria const &compareFunctor)
{

    /* The data is sorted by this map using the custom provided functor as criteria */
    std::map<InputDataType, ValueType, BaseSortingCriteria> sortedSets(compareFunctor);

    ...
}

为此,我创建了一个表示基本条件的虚拟函子,例如:

struct VirtualSortingCriteria
{
    virtual bool operator()(
        const InputDataType &var1,
        const InputDataType &var2) const = 0;
}

并且为了保留一个公共接口,一个基本的仿函数,它只执行在构造过程中传递的“真实”仿函数:

struct BaseSortingCriteria
{
    BaseSortingCriteria(
        std::shared_ptr<const VirtualSortingCriteria> pCompareFunctor) :
        m_realCompareFunctor(pCompareFunctor)
    {
    }

    bool operator()(
        const InputDataType &var1,
        const InputDataType &var2)
    {
        return m_realCompareFunctor->operator()(var1, var2);
    }

private:
    /** Pointer to the real functor to be used. */
    std::shared_ptr<const VirtualSortingCriteria> const m_realCompareFunctor;
}

而且我已经定义了几个要测试的“真实”函子:

struct RealFunctorVersionA final : public VirtualSortingCriteria
{
    bool operator () (
        InputDataType const &var1,
        InputDataType const &var2) const;
};

struct RealFunctorVersionB final : public VirtualSortingCriteria
{
    bool operator () (
        InputDataType const &var1,
        InputDataType const &var2) const;
};

实际使用这些不同排序标准的代码如下:

std::shared_ptr<VirtualSortingCriteria> cmpFunctor;
switch(userSelectedSortingCriteria)
{
    case CRITERIA_A:
        cmpFunctor.reset(new RealFunctorVersionA);
        break;
    case CRITERIA_B:
        cmpFunctor.reset(new RealFunctorVersionB);
        break;
    default:
        break;
}

BaseSortingCriteria baseCmpFunctor(cmpFunctor);
mainFunction(inputData, outputData, baseCmpFunctor);

所有这些都很好。但是,我认为要实现我想要的功能太复杂了,再加上我感觉必须使用多态功能意味着无法再内联“真正的”函子,这可能导致(尽管我尚未测量) )性能损失。

我不确定可以使用模板以更简单的方式解决此问题(因为函子的选择是在运行时完成的。

有什么建议吗?还是我只是考虑问题太深,这是可以接受的解决方案?性能如何?

我不使用(bool (*)(InputDataType const &var1, InputDataType const &var2))界面中的普通C风格函数mainFunction()来访问函子提供的额外功能,例如状态,构造参数等。>

非常感谢您的建议。

我有一组数据,需要根据用户在运行时确定的标准进行排序。理想情况下,必须将此排序标准作为参数传递给函数,例如:void ...

c++ polymorphism functor stdmap
1个回答
0
投票

您可以使用std::function,而不是多态性和滚动自己的类型擦除。例如:

© www.soinside.com 2019 - 2024. All rights reserved.