1

Как сделать std::bind для шаблонной функции с шаблонным параметром? Просто std::bind(&foo, arg) не работает, потому что тип foo не известен. Пока что в лоб сделал так std::bind(&foo<decltype(arg)>,arg), но может быть есть вариант лучше?

amiranys
  • 800
  • видели, что многие какую то функцию назывют так(не я) и везде пишете 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 Answers1

5
  1. Напрямую выполнить std::bind можно только так, как сделали вы (или эквивалентными способами), т.е. путем выбора конкретной специализации функции еще до выполнения std::bind.

  2. Однако также этот вопрос можно решить через промежуточную 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, т.е. как предоставить возможность оставить несвязанные параметры - не скажу навскидку.

  3. Ну и, конечно, можно предложить вообще отказаться от использования std::bind и вместо него использовать лямбды

    auto bound_foo = []() { return foo(arg); };
    

    С практической точки зрения это, наверное, самый правильный подход.