怎么样?我发现了很多例子,但找不到带参数模板的例子。我不知何故没有比较作用。
std::map<K, CacheEntry<T>*, Comparator<K, CacheEntry<T>>> timeMap_;
template<typename T1, typename T2>
struct Comparator
{
typedef std::pair<T1, T2> type;
bool operator()(const type& l, const type& r) const
{
auto nowTime = std::chrono::system_clock::now();
auto timeL = nowTime - l.second->creationTime();
auto timeR = nowTime - r.second->creationTime();
return (std::chrono::duration_cast<std::chrono::microseconds>(timeL).count() > std::chrono::duration_cast<std::chrono::microseconds>(timeR).count());
}
};
错误:
错误1错误C2664:&#39; bool 的DiaDoc ::缓存::比较 *&gt; :: operator()(const std :: pair&amp;,const std :: pair&amp;)const&#39; :无法从&#39; const std :: wstring&#39;转换参数1到#const; std :: pair&amp;&#39; c:\ program files(x86)\ microsoft visual studio 12.0 \ vc \ include \ xutility 521 1 DiadocClient
我尝试使用:
template<typename T1, class T2>
但它太不起作用了。 按第二个参数地图排序。
答案 0 :(得分:1)
不确定您要执行的操作,但std::map
仅比较键(即示例代码中的类型K
)。
您定义了一个比较一对的比较器,它不是std::map
所需的,因此是错误。
如果您的地图可能包含多个具有相同密钥的条目,则应使用multimap
代替。
答案 1 :(得分:1)
从您的评论中,您似乎需要一个容器:
K
和CacheEntry<T>
K
CacheEntry<T>
没有直接支持此标准的容器。您可以使用boost::multi_index_container
,如下所示:
typedef std::pair<K, CacheEntry<T>*> DataItem;
MyTimeType getTime(const DataItem &item)
{
return getTimeSomehowFrom(item);
}
typedef multi_index_container<
DataItem,
indexed_by<
ordered_non_unique<global_fun<DataItem, MyTimeType, &getTime>>,
hashed_unique<member<DataItem, K, &DataItem::first>>
>
> MyContainer;
(为简洁起见,该代码假定所有相关的#include
和using namespace
指令。
上面的代码不是copy&amp; paste&amp; use shape,但它应该是一个让你入门的指针。您可以阅读多索引容器并构建上述想法以满足您的需求(例如为索引添加标记)。
索引的顺序(有序,然后唯一)很重要 - 对于convenienec,容器本身继承了第一个索引的接口。在上述情况下,您可以将其视为按DataItem
结果排序的getTime()
集合,同时不允许K
的重复值。
作为旁注,请注意您不需要将now()
拖到比较器中。如果是(now - t1) < (now - t2)
,则只需t2 > t1
。