gpt4 book ai didi

c++ - 具有比较器功能和自定义参数的模板

转载 作者:行者123 更新时间:2023-11-28 06:59:28 26 4
gpt4 key购买 nike

我正在研究一个数据结构,我希望它具有比较功能,可以将其传递给构造函数,就像 STL 数据结构(集合、队列等)的工作方式一样。我还想要构造函数中提供的默认函数。

问题是,对结构的查询是一个函数模板,它将自定义类型作为参数。但是如果我不知道查询是什么类型,我不知道如何提供默认的比较功能。有办法做到这一点吗?

如果 Query 与 NodeType 相同(在此示例中 Query 无用),则此方法有效:

template<class NodeType, class Query = NodeType>
inline float eucDistance(const Query * p1, const NodeType * p2) {
...
}


template<class NodeType, typename Comp = decltype(eucDistance<NodeType>)>
class KDTree {

Comp* distance;

public:

KDTree(Comp comaprator = &eucDistance<NodeType>) : distance(comaprator) {

}

template<class Query = NodeType>
NodeType * nearestNeighbor(const Query *query) {
...
float tmp = distance(query, sth);
//I want something like distance<NodeType, Query>(query, sth);
...
}
}

但是我想做这样的事情:

class Point; //some type that the tree contains

KDTree<Point> tree;
Point p1;
Point *p = tree.nearestNeighbor(&p1); //this works with the given example
...
vec3 vec = ...; //some different type as a query
p = tree.nearestNeighbor<vec3>(vec); // <-- this is what I would like to do

最佳答案

template<typename Query, typename NodeType = Query>
inline float eucDistance(const Query * p1, const NodeType * p2) {
...
}

class KDTree {
public:
template<typename Query = NodeType, typename Comparator>
NodeType * nearestNeighbor(const Query *query, Comparator comp) {
...
float tmp = comp(query, sth);
...
}
}

此代码在成员函数级别接受比较器,因此它可以接受不同类型的节点。模板类型推导也将起作用;所以不要像这样调用函数 comp<T>(a, b);只是 comp(a, b)应该可以。

您的代码与采用比较器参数的 C++ 标准库函数(算法)之间的主要区别在于,它们不强制它们成为指针或指向函数的 C 样式指针。相反,他们使用 functors .

std::for_each它为传递的元素调用一个仿函数;因此需要一个仿函数

template <typename InputIter, typename UnaryFunc>
UnaryFunc std::for_each(InputIter first, InputIter last, UnaryFunc func)
{
for (; first != last; ++first)
func(*first);
return func;
}

如果您注意到,这里没有指针。它调用func与接线员 () ;这样做的好处在于它既适用于 C 风格的函数指针,也适用于 C++ 风格的仿函数,即 struct。用operator()定义。另请注意,用于仿函数的模板类型与仿函数接受的类型无关。

关于c++ - 具有比较器功能和自定义参数的模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22703047/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com