Могу ли я создать функцию без аргументов?

Итак, c ++ 17 содержит std::function Руководства по вычетам:

int foo();

Я могу сделать:

std::function bar(foo);

Но я застрял на c ++ 14 компилятор. Там мне нужно сделать еще что-то вроде: function<int()> bar(foo). Мне было интересно, есть ли способ создать std::function без передачи указателя функции и, явно предоставляя подпись функции? Так, например, make_pair будет определять тип его возврата из своих аргументов. . Мне было интересно, могу ли я написать что-то подобное для functions, даже используя c ++ 14, например:

auto bar = make_function(foo);

Это выполнимо?

Примечание. Мой реальный случай состоит в том, что foo - это шаблонная функция с множеством аргументов, которые я не хочу выводить. Итак, моя мотивация здесь - создать function без необходимости указывать типы параметров.

Живой пример


person Jonathan Mee    schedule 04.03.2019    source источник
comment
В вашем реальном случае std::function bar(foo) не работает в c ++ 17. Предоставьте фактический минимальный воспроизводимый пример того, что вы хотите сделать в юридическом c++17 и попросить реализовать нечто подобное в c ++ 14.   -  person Yakk - Adam Nevraumont    schedule 05.03.2019
comment
@ Yakk-AdamNevraumont Я не совсем понимаю, что вы имеете в виду, говоря, что он не работает ... Я добавил пример: пожимание плечами:   -  person Jonathan Mee    schedule 05.03.2019
comment
Мой реальный случай состоит в том, что foo - это шаблонная функция с множеством аргументов - ваш минимальный воспроизводимый пример принципиально отличается от вашего реального варианта использования, так как ваш реальный вариант использования не работает здесь. При написании минимального воспроизводимого примера начните с реального варианта использования, а затем сверните его. Не сворачивайте сначала.   -  person Yakk - Adam Nevraumont    schedule 05.03.2019
comment
@ Yakk-AdamNevraumont Итак, это мой исходный вопрос. Вы можете увидеть мой ответ внизу. Моя точка зрения в комментарии заключалась в том, чтобы попросить способ сгенерировать function, который можно было бы полностью определить, передав мне только указатель на функцию. Я думал, что это ясно? Моя редакция работает на вас?   -  person Jonathan Mee    schedule 05.03.2019
comment
@ Yakk-AdamNevraumont Я собираюсь взять это из вашего редактирования, что вы подтверждаете, где мы сейчас находимся?   -  person Jonathan Mee    schedule 05.03.2019


Ответы (1)


В конце вашего вопроса мелким шрифтом выделена самая важная часть. Если ваш foo является шаблоном, руководства по выводам C ++ 17 не помогут вам с таким простым синтаксисом, как

std::function f(foo);

Вам все равно потребуется предоставить аргументы шаблона для foo. Предполагая, что вы согласны с указанием типов аргументов foo (как и должно быть), написание make_func является тривиальным упражнением:

 template<class R, class... ARGS>
 auto make_func(R (*ptr)(ARGS...)) {
      return std::function<R (*)(ARGS...)>(ptr);
 }

И чем вы его используете:

auto bar = make_func(&foo<Z, Y, Z>);
person SergeyA    schedule 04.03.2019
comment
Я согласен, потому что это гениальное решение на C ++ 14. Но мне неприятно говорить, что это все еще не работает в Visual Studio 2017 версии 15.6.7: ideone.com/T52Gxn Я получаю эту ошибку: ошибка C2039: result_type: не является членом глобального пространства имен, когда я пытаюсь использовать make_func, чтобы получить тип возвращаемого значения в enable_if_t. Я собираюсь открыть новый вопрос, чтобы узнать, есть ли обходной путь ... - person Jonathan Mee; 07.03.2019
comment
Я спросил, есть ли у вас какие-либо предложения: stackoverflow.com/q/55047417/2642059 - person Jonathan Mee; 07.03.2019
comment
Просто замечание для будущих читателей: мне нужна была функция, возвращающая std::funciton, чтобы я мог извлечь возвращаемый тип. Это фантастический ответ, и его следует принять для данного вопроса. Однако, если ваши интересы более совпадают с моими, я основал ответ C ++ 14 на этом: stackoverflow.com/a/55050902 / 2642059 - person Jonathan Mee; 11.03.2019