在模板化矢量中查找重复项

时间:2015-08-24 14:23:36

标签: c++ templates

我有一个模板$location.path('/someNewPath'); $location.replace(); // or you can chain these as: $location.path('/someNewPath').replace();

class Timer

现在我想在template<typename Clock, typename Duration> class Timer { public: void Register(const std::function<void(const std::chrono::time_point<Clock> &timePoint)> &eventHandler); private: std::vector<std::function<void(const std::chrono::time_point<Clock> &timePoint)>> eventHandlers; // Some more stuff. }; 中找到重复的条目,这就是问题所在 我尝试了使用Register和简单std::find循环的不同方法。

到目前为止我能做到的最好(删除名称空间以便于阅读):

for

我的问题是将typename vector<function<void(const time_point<Clock> &timePoint)>>::iterator it; for(it = eventHandlers.begin(); it != eventHandlers.end(); ++it) { } 的参数与Register进行比较 我试过几件事:

it

......以及其他一些更复杂的方法,但没有一种方法有效 我在解决这个方面遇到了一些麻烦,因为我通常在C#中编码,因此我不习惯在C ++中进行模板化。
我该如何解决这个问题,是否有更优雅的解决方案来解决这个问题?

编辑:
我经常收到这个错误:

typename function<void(const time_point<Clock> &timePoint)> &f = &(*it);
if(f == eventHandler)
{
    // Duplicate
}

1 个答案:

答案 0 :(得分:1)

注意:

typename function<void(const time_point<Clock> &timePoint)> &f = &(*it);
if(f == eventHandler)
{
    // Duplicate
}

我认为你的意思是放typename function<void(const time_point<Clock> &timePoint)> *f,因为&(*it)返回指针类型而不是引用。

<强>更新

std::function不具有==可比性,因此您可以执行以下操作:

不使用std::function而是使用类似的函数指针(再次使用typedef):

typedef void(*name_of_type)(const time_point<Clock>&)>

然后将name_of_type替换为您想要的任何名称。

这样您可以将operator==与函数指针一起使用

更新#2

我将把所有内容都放入你的课堂中来澄清一切:

template<typename Clock, typename Duration>
class Timer
{
public:
    typedef void(*name_of_type)(const time_point<Clock>&)>

    void Register(name_of_type eventHandler);

private:
    std::vector<name_of_type> eventHandlers;
// Some more stuff.
};

使用for循环,您可以执行以下操作:

[非C ++ 11]

typename vector<name_of_type>::iterator it;
for(it = eventHandlers.begin(); it != eventHandlers.end(); ++it)
{
//do what you want with *it
}

[c ++ 11开始]

for(auto& x: eventHandlers)
{
//do what you want with x
}