Путаница: decltype против std :: function - PullRequest
0 голосов
/ 21 февраля 2020

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

    int fun(int);
    [...]
    std::queue<std::function<int(int)>> q0;
    std::queue<decltype(fun)> q1;
    std::queue<int (int)> q2;

Полный код https://onlinegdb.com/rkvAdPpmU

К сожалению, decltype<fun> и int (int) не разрешены. Если честно, я предпочитаю способ std::function. Теперь для следующей части ...

Недавно я придумал вещь под названием packaged_task. Я попытался определить шаблон так же, как и с очередью:

    int fib(int);
    [...]
    std::packaged_task<int (int)> f0(fib);
    std::packaged_task<decltype(fib)> f1(&fib);
    std::packaged_task<std::function<int(int)>> f2(&fib);

Полный код https://www.onlinegdb.com/B17iYvaQL

Компиляция привела к другому результату. Теперь std::function дал error: variable ‘std::packaged_task<std::function<int(int)> > f2’ has initializer but incomplete type. Другие способы инициализации в порядке.

Мои вопросы:

1) int (int) эквивалентно decltype(fib), где int fib(int)?

2) Пока я понимаю что std::function на самом деле является шаблонным классом, разве он не должен использоваться одинаково в queue и packaged_task?

1 Ответ

3 голосов
/ 21 февраля 2020

Вы не можете сохранять функции, но вы можете хранить указатели функций:

std::queue<decltype(&fun)> q1;
std::queue<int (*)(int)> q2;

Демо

  • decltype(fun) равно int (int)
  • decltype(&fun) - это int (*)(int)

std::packaged_task, поскольку std::function ожидает подпись,

, поэтому std::packaged_task<int(int)> и std::packaged_task<decltype(fib)> в порядке.

std::function<int(int)> - это тип, а не подпись, поэтому std::packaged_task<std::function<int(int)>> недопустимо (на самом деле не определено), поэтому его невозможно использовать.

...