布尔函数作为输入参数

时间:2013-04-02 16:05:30

标签: c++ c++11 lambda signature

我想编写一个执行某些操作的方法,直到终止条件成立为止。该终止标准应由用户给出,并且可以是任何标准。

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

在Python中,这将是

class Example:

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

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

2 个答案:

答案 0 :(得分: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,但this will certainly cost you some run-time overhead(这可能与您的用例无关)。

答案 1 :(得分: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()的类也可以使用相同的函数。