如何将其转换为for_each循环?
template <typename Container>
void draw_all(const Container &c, const rectangle &w)
{
complex<double> bl, tr;
bl = w.get_bl();
tr = w.get_tr();
for (typename Container::const_iterator p= c.begin(); p != c.end(); p++)
{
if((*p)->inside_window(bl,tr))
(*p)->draw();
}
}
我正在尝试:for_each(c.begin(), c.end(), w.inside_window(w.get_bl(),w.get_tr()));
我得到错误:将'const rectangle'作为'this'参数'virtual bool rectangle :: inside_window(const std :: complex&amp;,const std :: complex&amp;)'丢弃限定符[-fpermissive]
编辑:在窗口内()
bool rectangle::inside_window(const complex<double> &_bl, const complex<double> &_tr)
{
if(_bl.real() > bl.real() || _tr.real() > tr.real() || _bl.imag() > bl.imag() || _tr.imag() > tr.imag())
{
return false;
}
else
return true;
cout.flush();
}
的for_each():
template<typename InputIter, typename UnaryFunction>
UnaryFunction for_each(InputIter first, InputIter last, UnaryFunction fn)
{
while (first != last)
fn(* first++); // Increment first but dereference its old value.
return fn;
}
答案 0 :(得分:2)
您需要将rectangle::inside_window()
声明为const
方法:
virtual bool inside_window(const std::complex&, const std::complex&) const;
// ^^^^^
这样this
类型const rectangle*
而不只是rectangle*
,这允许在inside_window()
上调用const rectangle
,因为它必须位于for_each()
{1}}。
但是,你的逻辑是有缺陷的:如果你想测试 inside_window()
的结果并有条件地调用draw()
,那么{{1}的唯一方法就是这样做使用辅助方法,或者作为仿函数:
for_each()
或作为一个lambda:
struct draw_visible : public std::unary_function<rectangle, void> {
const std::complex<double> bl, tr;
draw_visible(const std::complex<double>& bl, const std::complex<double> tr)
: bl(bl), tr(tr) {}
void operator()(const rectangle& r) const {
if (r.inside_window(bl, tr))
r.draw();
}
};
template<class Container>
void draw_all(const Container& c, const rectangle& w) {
std::for_each(c.begin(), c.end(), draw_visible(w.get_bl(), w.get_tr()));
}
此外,您可能不应该使用template<class Container>
void draw_all(const Container& c, const rectangle& w) {
std::for_each(c.begin(), c.end(), [&w](const rectangle& r) {
if (r.inside_window(w.get_bl(), w.get_tr())
r.draw();
});
}
来模拟点数。自定义结构在语义上更合适:
std::complex
答案 1 :(得分:0)
只是一个猜测,但我会说inside_window不是const方法,这就是你得到那个错误的原因。你能告诉我们代码吗?
你已经宣布p为const,这意味着你承诺不使用它来改变任何东西。但是你的inside_window()方法不承诺不这样做,因此编译说你不尊重这个承诺。 make inside_window const,这应该消失(如果确实你没有改变该方法内的任何东西,那么这将是一个简单的修复)
答案 2 :(得分:0)
for_each的第三个参数需要是一个函数。更具体地说,一个函数接收*p
并为你的循环做主体
/* function or method */ (const Container& c){
if(c->inside_window(cl, tr))
c->draw();
}
但请注意我们如何跟踪cl
和tr
for out功能。这项工作的方法是使函数成为operator ()
和cl
作为实例变量的对象的tr
重载。
class Drawer{
complex<double> bl, tr;
Drawer(/*constructor parameters, probably w*/){ /*...*/}
void operator() (const Container& c){ /*...*/ }
};
for_each(c.begin(), c.end(), Drawer(w));