3

終了基準が真になるまで何らかのアクションを実行するメソッドを書きたいと思います。この終了基準はユーザーが指定する必要があり、任意の基準にすることができます。

戻り値の型がブール値 (おそらくクロージャー) の関数をメソッドに渡して、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();
    }
}

たとえば、次のようにラムダを渡して呼び出すことができます。

int main()
{
    // Possibly pass a more clever lambda here...
    doSomething([] () { return true; });
}

もちろん、ラムダの代わりに通常のファンクターを渡すこともできます。

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()を述語として取りました。ただし、ラムダ関数またはクラス定義bool operator()は同じように機能します。

于 2013-04-02T16:09:24.600 に答える