Сложите функцию с помощью || оператор - PullRequest
0 голосов
/ 31 августа 2018

Я пытаюсь применить функцию к каждому типу в пакете параметров и затем свернуть результат.

Пример: https://godbolt.org/z/0YNon_

#include <cstdint>
#include <string>

template<typename T>
bool CheckCondition(std::uint64_t i){
    return i>sizeof(T);
}

template <typename... ToCheck>
bool AnyCheckCondition(std::uint64_t i){
    return CheckCondition<ToCheck>(i)||...;
}

int main() 
{
    return AnyCheckCondition<std::string,std::uint64_t, std::int64_t>(10);
}

К сожалению, выражение сгиба не компилируется, и я не уверен, почему или как это исправить.

Я получаю следующие ошибки

<source>: In function 'bool AnyCheckCondition(uint64_t)':

<source>:11:35: error: parameter packs not expanded with '...':

     return CheckCondition<ToCheck>(i) || ...;

            ~~~~~~~~~~~~~~~~~~~~~~~^~~

<source>:11:35: note:         'ToCheck'

<source>:11:38: error: expected ';' before '||' token

     return CheckCondition<ToCheck>(i) || ...;

                                      ^~~

                                      ;

<source>:11:39: error: expected primary-expression before '||' token

     return CheckCondition<ToCheck>(i) || ...;

                                       ^~

Compiler returned: 1

Ответы [ 2 ]

0 голосов
/ 31 августа 2018

складное выражение имеет вид

( pack op ... )
( ... op pack )
( pack op ... op init )
( init op ... op pack ) 

Вам не хватает этих внешних скобок. Изменение кода на

return (CheckCondition<ToCheck>(i) || ...);

получит его для компиляции.

0 голосов
/ 31 августа 2018

Для выражений сгиба требуются круглые скобки.

return (CheckCondition<ToCheck>(i) || ...);
...