Примените функцию к каждому значению пакета параметров и проверьте возвращаемые значения - PullRequest
0 голосов
/ 21 ноября 2018

Иметь этот рабочий код:

template < class... Objects >
static void callNotifyOnPointerObjects ( Objects&&... objects )
{
    int arr[] = { 0, ( static_cast< void > ( objects->Notify () ), 0 )... };
    static_cast< void > ( arr );
}

objects->Notify() возвращаемое значение равно bool

Как я могу поместить в массив bool возвращаемые значения, полученные при выполнении objects->Notify()и проверьте, все ли значения true:

template < class... Objects >
static bool callNotifyOnPointerObjects ( Objects&&... objects )
{
    // Put in this array return values from objects->Notify () execution
    bool rc [sizeof...(objects)] = {false};
    int arr[] = { 0, ( static_cast< void > ( objects->Notify () ), 0 )... };
    static_cast< void > ( arr );
    // check if all values in rc == true and return true or false
    // return result;
}

1 Ответ

0 голосов
/ 21 ноября 2018
struct foo {
    bool Notify() const { return /* something */; }
};

template<typename... Objects>
bool callNotifyOnPointerObjects(Objects&&... objects)
{
    bool rc[]{ objects->Notify() ... };
    for (auto const &c : rc)
        if(!c) return false
    return true;
}

Или вместо for -loop, используйте std::all_of(), как предложено @nm в комментарии:

#include <iterator>
#include <algorithm>

// ...

template<typename... Objects>
bool callNotifyOnPointerObjects(Objects&&... objects)
{
    bool rc[]{ objects->Notify() ... };
    return std::all_of(std::begin(rc), std::end(rc), [](bool b){ return b; });
}

Однако это может бытьболее производительный просто

template<typename... Objects>
bool callNotifyOnPointerObjects(Objects&&... objects)
{
    return (objects->Notify() + ...) == sizeof...(objects);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...