// implementation 
                  
                  
                  }
                  
                  
                  
                  
                  
                  template<typename T>
                  
                  
                  void f(const T& val)
                  
                  
                  {
                  
                  
                      // implementation (just copy-paste from `f(T& val)`)
                  
                  
                  }
                  
                  
                  
                  
                  
                  int value = 0;
                  
                  
                  f(value);    // call 1, resolves to `f(T& val)`
                  
                  
                  f(int());    // call 2, resolves to `f(const T& val)`
                  
                  
                  Известен ли кому-нибудь способ схлопнуть обе перегрузки функции f в одну и избавиться от копипаста? Если просто удалить f(const T& val), то второй вызов приведет к ошибке компиляции. Знаю, что можно создать функцию f_impl, вынести в нее имплементацию и вызывать `f_impl`из двух перегрузок, но это не совсем мне подходит.
                  
                  
                
А ты удали ПЕРВУЮ из фукнций, а не вторую.
Там шаблонный код внутри обоих перегрузок. Делает разные вещи, но реализация одна
Короче, не надо быть умным тут. Сделай две функции с одинаковым на вид кодом.
> Знаю, что можно создать функцию f_impl, вынести в нее имплементацию и вызывать `f_impl`из двух перегрузок, но это не совсем мне подходит. Почему?
Потому что const T& нельзя преобразовать в T& ...
Обсуждают сегодня