我有一个模板$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
}
答案 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
}