gpt4 book ai didi

C++ STL 比较类 : how to parameterize comp-class behaviour?

转载 作者:行者123 更新时间:2023-11-30 04:35:16 30 4
gpt4 key购买 nike

我想使用一个带有自定义数据类型和几个比较标准的 std::priority_queue 容器(我为每个标准定义了一个仿函数;每个标准都在相同的类型上工作)。所使用的比较标准本身应该可以通过函数参数进行配置(避免队列的 if_then_ 初始化)。

基于 this post ,据我所知,使用一个比较仿函数,它本身是用一个指向定义的比较函数之一的函数指针初始化的,我试图使用一个可配置的比较仿函数,它是用另一个比较仿函数初始化的(它然后存储在本地并在调用时使用)。我还没有让它工作。

我什至不知道是否有可能做我想做的事情。我不知道我是否在类型方面做错了什么(我使用了 typedef boost::function xxx)或需要额外的 C++0x 特性(“闭包”会有帮助吗?)。

所以基本上我想要像下面这样的东西来工作(这不会编译出一个不长但丑陋的错误;GCC 4.5):

#include <iostream>
#include <queue>
#include <boost/tuple/tuple.hpp>
#include <boost/function.hpp>

typedef boost::tuple<double, int> custom_type; // example only!
typedef boost::function<bool (const custom_type & l, const custom_type & r)> comp_type; // comparison functor

struct fifo_comp
{
bool operator() (const custom_type & l, const custom_type & r) const
{
// compare only id
return l.get<1>() > r.get<1>();
}
};

struct lifo_comp
{
bool operator() (const custom_type & l, const custom_type & r)
{
// compare only id
return l.get<1>() < r.get<1>();
}
};

class Compare
{
public:
explicit Compare(const comp_type & comp);

bool operator() (const custom_type & l, const custom_type & r)
{
return comp(l, r);
}

private:
const comp_type & comp;
};

class Some_Class_Using_Queue
{
public:
Some_Class_Using_Queue(comp_type & comp) : pqueue(Compare(comp)) {}

void test()
{
pqueue.push(custom_type(1.0, 1));
}

private:
std::priority_queue<custom_type, std::vector<custom_type>, Compare> pqueue;
};

int main()
{
comp_type f = fifo_comp();
Some_Class_Using_Queue temp((f)); // critical
temp.test();
return 1;
}
  • 有任何帮助让它为我工作(鼓励使用 STL/Boost)吗?
  • 有什么更好的想法(完全不同)吗?
  • 有什么很酷的 C++0x 特性可以帮助解决这个问题(也许是闭包)?

谢谢。

PS/Edit:我知道,使类模板化并使用适当的 comp-class 作为模板参数调用该类是可能的,而且真的很容易。但我不知道这是否是更好的方法(关于设计)。使用这种方法,我必须在调用之前切换/if-else,因为需要模板参数在编译时可用。

PS:我设置了“priority_queue”标签,即使这个问题可能完全独立于这个适配器类。如果有人想删除它,那就去做吧。

最佳答案

您缺少Compare 构造函数的定义:

explicit Compare(const comp_type & comp) : comp(comp) { }

除此之外,它为我构建和运行。

此外,Compare 似乎是多余的。它只是用相同的接口(interface)包装 comp_type。删除 Compare 类并将其替换为 comp_type 后,代码仍会生成并运行。

关于C++ STL 比较类 : how to parameterize comp-class behaviour?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5453950/

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