c++ - 一个参数依赖于另一个参数的模板
问题描述
我有以下情况。假设我们要实现一个排序数组数据结构,它在插入时保持数组排序。在第一次尝试时,我会做类似的事情:
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++ 中是否可行?
解决方案
您可以非类型模板参数如下:
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 作为模板参数。
不再需要使用派生的模板参数进行任何模板操作。
推荐阅读
- reactjs - i18n 从 s3bucket 加载翻译
- angular - 引导选择不以角度动态更新
- sql-server - 分析服务连接问题
- angular - Angular从api获取特定字段数据
- node.js - Firebase 登录引发错误:在 NodeJS 中生成 cmd ENOENT
- xml - vb.net xml第二次运行代码不重复同样的结果
- python - “/result”处的 NoReverseMatch
- ruby - 如何使用 ruby 查找 Linux 机器中存在的子目录
- elasticsearch - Elasticsearch:按字段排序,最后带有 custom_null 值
- python - Python3:将递归函数注入函数中的 exec()