如何使 C++ 中不同模板的函数表现不同?

How to make functions behave differently for different templates in C++?

我的 C++ 作业的一部分是为这个 main 创建 FooClass:

int main()
{
    const int max = 10;

    int x[] = {10, 20, 7, 9, 21, 11, 54, 91, 0, 1};
    FooClass<int> xl(x, max);

    int x2[] = {10, 20, 7, 9, 21, 11, 54, 91, 0, 1};
    FooClass<int, std::greater<int> > xg( x2, max);

    xl.sort();
    xg.sort();
    xl.print();
    xg.print();
}

目标是使第一个排序升序,第二个排序降序:

0  1  7  9  10  11  20  21  54  91
91  54  21  20  11  10  9  7  1  0

到目前为止,这是我的代码:

template <typename T, typename F=std::greater<T>>
class FooClass
{
private:
    T *mItems;
    int mItemsSize;
    bool mpermission;

public:
    FooClass(T items[], int itemsSize)
    {
        this->mItemsSize = itemsSize;
        this->mItems = items;
    };

    void print() const
    {
        for (int i = 0; i < mItemsSize; ++i)
        {
            std::cout << mItems[i] << "  ";
        }
        std::cout << std::endl;
    }

    void sort()
    {
        std::sort(mItems, mItems + mItemsSize);
    }

};

我的代码当前打印输出:

0  1  7  9  10  11  20  21  54  91
0  1  7  9  10  11  20  21  54  91

而且我正在努力使我的排序函数根据输入模板参数表现不同。有什么办法可以做到这一点吗?

首先,你没有使用F。您需要将 F 的实例传递给 std::sort:

void sort()
{
    std::sort(mItems, mItems + mItemsSize, F{});
}

其次:您的默认 F 将使您示例中的两个实例以相同的方式对数组进行排序。要获得预期的结果,您应该使用 std::less<T> 代替默认值 F

template <typename T, typename F=std::less<T>>
class FooClass
{
    //...
};