首页 > 解决方案 > 一个参数依赖于另一个参数的模板

问题描述

我有以下情况。假设我们要实现一个排序数组数据结构,它在插入时保持数组排序。在第一次尝试时,我会做类似的事情:

template<typename T, typename Comparator, Comparator comparator>
SortedArray {
public:
    void find(T value);
    void insert(T value);
    void remove(T value);
}

参数T当然是数组中元素的类型。然后我需要一个比较器来告诉如何比较类型的对象,T以便我可以保持元素排序。由于我希望同时允许函数指针(如在经典中qsort)以及函数对象和可能的 lambda,因此我需要为比较器添加模板参数。

现在的问题是我希望编译器根据第三个参数自动推导出第二Comparator个参数。现在,一个典型的用法是decltype利用

int compare_int(int x, int y) {
    return x - y;
}
SortedArray<int, decltype(compare_int), compare_int> myArray;

但这不适用于 lambda,当然我很想写

SortedArray<int, compare_int> myArray;

反而。

任何想法或目前在 C++ 中是否可行?

标签: c++templates

解决方案


您可以非类型模板参数如下:

template<typename T, auto C > 
class SortedArray 
{
    private:
    std::vector<T> v;
    public:
    void sort(){ std::sort( v.begin(), v.end(), C );} 
    void print() { for( auto& el: v ) std::cout << el << std::endl; }
    void push(T t){ v.push_back(t);}
};

bool compare_int( int a, int b ) 
{
    return a<b;
}

int main()
{
    SortedArray<int, compare_int> sa1;
    sa1.push(5);
    sa1.push(3);
    sa1.push(7);

    sa1.sort();
    sa1.print();


    SortedArray<int, [](int a, int b){ return a<b;} > sa2;
    sa2.push(5);
    sa2.push(3);
    sa2.push(7);

    sa2.sort();
    sa2.print();
}

如您所见,您还可以使用 lambda 作为模板参数。

不再需要使用派生的模板参数进行任何模板操作。


推荐阅读