получить результирующий тип std :: bind

Я пытаюсь получить результирующий тип std :: bind в сочетании с лямбдой. Я пробовал следующие два:

template<typename F>
typename std::result_of<std::bind(F,uint)> func(F f, uint i);

Это не работает по какой-то причине. Я также пробовал использовать decltype:

template<typename F>
decltype(std::bind(F(),uint()) func(F f, uint i);

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

Не могли бы вы помочь мне здесь? Я безуспешно пытался найти ответы в сети.

Спасибо!


person user3617992    schedule 11.01.2018    source источник
comment
template<typename F> auto func(F f, uint i) -> decltype(std::bind(f, i)); или используйте std::declval для C ++ 11. decltype(auto) для C ++ 14.   -  person Jarod42    schedule 11.01.2018
comment
связывать в сочетании с лямбдой? Нет никакой причины использовать привязку. Используйте лямбду.   -  person    schedule 11.01.2018


Ответы (1)


Я предлагаю использовать decltype(auto) следующим образом:

template<typename F>
decltype(auto) func(F f, uint i) { // ... }

поэтому тип возвращаемого значения будет выводиться компилятором.


Тогда я не думаю, что std::result_of является подходящим инструментом в этом случае .

Но с decltype вы также можете сделать именно то, что @ Jarod42 упомянул в комментарии : используйте завершающий тип возврата:

template<typename F>
auto func(F f, uint i) -> decltype(std::bind(f, i)) { // ... }

который также должен работать с C ++ 11 (самое первое решение требует поддержки C ++ 14).

person Edgar Rokjān    schedule 11.01.2018