Как сделать std::bind для шаблонной функции с шаблонным параметром?
Просто std::bind(&foo, arg) не работает, потому что тип foo не известен. Пока что в лоб сделал так std::bind(&foo<decltype(arg)>,arg), но может быть есть вариант лучше?
Asked
Active
Viewed 134 times
1
-
видели, что многие какую то функцию назывют так(не я) и везде пишете foo foo foo. Вы думаете, что foo это какая то определенная стандартная функция? А если нет, то хотябы покажите ее обьявление – AR Hovsepyan Dec 18 '18 at 01:24
-
@ARHovsepyan https://ru.stackoverflow.com/q/555385/320823 – студент Dec 18 '18 at 01:30
-
дело в том, что вы не понели смысль моего комментария. Вам нужно правильно подать вопрос, а ваш foo неизвестно что в вашем вопросе. – AR Hovsepyan Dec 18 '18 at 02:38
-
@ARHovsepyan шаблонная функция с шаблонным параметром, написано же – студент Dec 18 '18 at 02:42
-
шаблонная функция не известна, если не известны количество и типы аргументов и тип возвращаемого значения – AR Hovsepyan Dec 18 '18 at 07:54
1 Answers
5
Напрямую выполнить
std::bindможно только так, как сделали вы (или эквивалентными способами), т.е. путем выбора конкретной специализации функции еще до выполненияstd::bind.Однако также этот вопрос можно решить через промежуточную variadic template функцию
#include <functional> #include <iostream> template <typename A, typename B, typename C> void foo(A a, B b, C c) { std::cout << a << " " << b << " " << c << std::endl; } template<typename ...T> auto my_bind(void (*f)(T ...), T ...args) { return std::bind(f, args...); } int main() { auto bound_foo = my_bind(foo, 1, 2.0, "Hello"); bound_foo(); }Вот как только развить это до использования
std::placeholders, т.е. как предоставить возможность оставить несвязанные параметры - не скажу навскидку.Ну и, конечно, можно предложить вообще отказаться от использования
std::bindи вместо него использовать лямбдыauto bound_foo = []() { return foo(arg); };С практической точки зрения это, наверное, самый правильный подход.
AnT stands with Russia
- 69,346