[英]Boolean function as input parameter
我想写一个方法,它执行一些操作,直到终止标准变为真。 该终止标准应由用户给出,并且可以是任何标准。
我正在考虑将一个带有返回类型boolean(可能是一个闭包)的函数传递给该方法,并将其作为while循环的条件调用。
在Python中,这将是
class Example:
def doSomething(self, amIDone):
while not amIDone():
something()
return
我怎样才能在C ++ 11中表达这一点?
您可以使您的函数成为模板,并让它接受任何返回bool
可调用对象。 例如:
template<typename P>
void doSomething(P&& p)
{
while (p())
{
something();
}
}
这是你通过传递lambda来调用它的方法,例如:
int main()
{
// Possibly pass a more clever lambda here...
doSomething([] () { return true; });
}
当然你可以传递一个普通的仿函数而不是一个lambda:
struct my_functor
{
// Possibly write a more clever call operator here...
bool operator () ()
{
return true;
}
};
int main()
{
doSomething(my_functor());
}
函数指针也是一个选项:
// Possibly use a more clever function than this one...
bool my_predicate()
{
return true;
}
int main()
{
doSomething(my_predicate);
}
如果你有理由不让你的函数成为模板(例如,因为它是某个类的virtual
函数成员函数),你可以使用std::function
:
void doSomething(std::function<bool()> p)
{
while (p())
{
something();
}
}
上面的所有示例都可以与std::function
一样好用,但这肯定会花费你一些运行时开销 (尽管这可能与你的用例无关)。
你可以使用<functional>
头文件中的std::function
来做到这一点。
谓词看起来像这样:
bool predicate()
{
...
return false;
}
这是使用谓词仿函数的类
struct A
{
void test (std::function<bool(void)> func)
{
while( func() )
{
perform();
}
}
}
你可以这样称呼它:
A a;
a.test(predicate);
在这个例子中,我将函数bool predicate()
作为谓词。 但是lambda函数或定义bool operator()
的类可以使用相同的函数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.