шаблоны переменных: список выражений обрабатывается как составное выражение при функциональной ошибке - PullRequest
0 голосов
/ 09 января 2019

Я пытаюсь передать функцию в качестве параметра, а пакет параметров - в качестве второго аргумента для функции-оболочки.

В этом простом случае функция-обертка должна выполнить переданную функцию с параметром в пакете, измерить время выполнения и выйти.

Но я получаю ошибку компиляции с g ++ 7.3.0 (c ++ 14) в Ubuntu 18.04:

error: expression list treated as compound expression in functional cast [-fpermissive] 

для строки:

func(&args...);

Обёртка выглядит следующим образом:

template<typename func, typename ...Types>
void measure_time(func, Types... args)
{
    auto start = std::chrono::system_clock::now();

    // execute function here
    func(&args...);

    auto end = std::chrono::system_clock::now();
    std::cout << "Time for execution "
        << std::chrono::duration_cast<std::chrono::microseconds>(end-start).count()
        << " microseconds\n";
}

Я новичок в универсальном программировании и пакетах параметров, но после ссылки cpp для пакетов параметров это должно работать?

вызов функции measure_time, например с простым поиском двоичного кода:

int binary_search(int *a, int v, int l, int r)
{
    while(r >= 1)
    {
        int m = (l+r)/2;
        if(v == a[m]) return m;
        if(v < a[m]) r = m-1; else l = m+1;
        if(l==m || r==m) break; 
    }
    return -1;
}

Создает следующий экземпляр (который мне кажется правильным) как источник ошибки:

 In instantiation of ‘void measure_time(func, Types ...) [with func = int (*)(int*, int, int, int); Types = {int*, int, int, int}]’:

Я нашел эту статью, описывающую ошибку компилятора, но мне не хватает знаний, чтобы понять ситуацию, и я не могу вывести работоспособное решение, если это так: временные объекты с переменными аргументами шаблона; другая разница g ++ / clang ++

РЕДАКТИРОВАТЬ: Запуск программы с флагом -fpermissive и последующее выполнение программы работает без сбоев.

1 Ответ

0 голосов
/ 09 января 2019

Должно быть:

template<typename Func, typename ...Types>
void measure_time(Func func, Types&&... args)
{
    auto start = std::chrono::system_clock::now();

    // execute function here
    func(std::forward<Types>(args)...);

    auto end = std::chrono::system_clock::now();
    std::cout << "Time for execution "
        << std::chrono::duration_cast<std::chrono::microseconds>(end-start).count()
        << " microseconds\n";
}

Но еще лучше было бы иметь время в классе RAII, чтобы можно было легко возвращать значение вашей функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...