3

我想编写一个执行某些操作的方法,直到终止标准变为真。这个终止标准应该由用户给出,它可以是任何标准。

我正在考虑将返回类型为 boolean(可能是闭包)的函数传递给该方法,并将其作为 while 循环的条件调用。

在 Python 中,这将是

class Example:

    def doSomething(self, amIDone):
        while not amIDone():
            something()
        return

如何在 C++11 中表达这一点?

4

2 回答 2

8

您可以将您的函数设为模板,并让它接受任何返回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上面的所有示例都可以与 .

于 2013-04-02T16:09:42.597 回答
2

您可以使用标题来执行此std::function操作<functional>

谓词如下所示:

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()的工作方式相同。

于 2013-04-02T16:09:24.600 回答