Как в С++ вызвать шаблонную функцию напрямую? [обновлено]

205
30 января 2018, 10:43

Добрый день.

Пусть есть шаблонная функция (примеры не транслировал):

template <class T> T fun(T s1, T s2){return s1+s2;}

Теперь, чтобы получить разные функции, можно сделать так:

char fun1(char s1, char s2){return fun<char>(s1,s2);}
int fun2(int s1, int s2){return fun<int>(s1,s2);}
float fun3(float s1, float s2){return fun<float>(s1,s2);}

Однако, если бы я написал эти функции не через шаблон, то я бы съэкономил один вызов:

char fun1(char s1, char s2){return s1+s2;}
int fun2(int s1, int s2){return s1+s2;}
float fun3(float s1, float s2){return s1+s2;}

Вопрос:

  1. Как сделать так, чтобы в случае шаблонной функции не было лишнего вызова? То есть синтаксически это должно выглядеть так, что при инстанцировании шаблона функции имя функции тоже менялось. И инстанцированный шаблон получал новое имя fun1, fun2, fun3 вместе с параметром-типом аргумента.

Спасибо.

UPD1:

Дотошные коллеги убедили меня уточнить проблему. Действительно, приведенный пример упрощен, по сравнению с жизнью. Тем не менее даже пример показывает всю проблему, хотя, возможно, и не так очевидно. Уточним пример. Итак, на самом деле есть шаблон функции с параметром шаблона - указателем на другую функцию (примеры не транслировал).

template <typename float (*libfun)(float)> int myfun(int a1,float a2,double a3){
float res=libfun(a2);
//здесь много обработки, одинаковой для всех libfun
return ret;
}

теперь инстанцируем шаблон:

int ret1=myfun<&sin>(1,2,3);
int ret2=myfun<&cos>(1,2,3);
int ret3=myfun<&exp>(1,2,3);

Вроде бы все на месте. Проблема в том, что на самом деле мне нужны нешаблонные функции с одинаковым прототипом:

int mysin(int a1,float a2,double a3);
int mycos(int a1,float a2,double a3);
int myexp(int a1,float a2,double a3);

При этом функции mysin, mycos, myexp должны вызываться из сторонней библиотеки callback-ом. Поэтому они не могут быть шаблонными и должны иметь именно такой прототип.

Можно сделать так (как собственно и сделано в первом примере):

int mysin(int a1,float a2,double a3){return myfun<&sin>(a1,a2,a3);}
int mycos(int a1,float a2,double a3){return myfun<&cos>(a1,a2,a3);}
int myexp(int a1,float a2,double a3){return myfun<&exp>(a1,a2,a3);}

Но при этом получается лишний вызов.

Итак, снова тот же вопрос:

  1. Как сделать так, чтобы в случае шаблонной функции не было лишнего вызова? То есть синтаксически это должно выглядеть так, что при инстанцировании шаблона функции имя функции тоже менялось. И инстанцированный шаблон получал новое имя mysin, mycos, myexp вместе с параметром-типом аргумента.
Answer 1

Можно не заморачиваться:

auto fun(auto s1, auto s2) {
    return s1 + s2;
}
int main() {
  std::cout << fun(std::string("A"), "B") << std::endl;
}

Можно взять ссылку:

auto constexpr f = fun<std::string>;
READ ALSO
Почему при команде delete[] выходит ошибка?

Почему при команде delete[] выходит ошибка?

Пожалуйста, объясните что не так

191
с++ детект и закрытие процессов [требует правки]

с++ детект и закрытие процессов [требует правки]

Нужно написать dll которая будет детектить процессы по имени окна и классамИ закрывать приложение в которое она подключена после детекта...

194
Дано радиус круга и сторона квадрата. Сравнить периметр указанных фигур на с++ [требует правки]

Дано радиус круга и сторона квадрата. Сравнить периметр указанных фигур на с++ [требует правки]

Мне нужна программа на с++ Дано радиус круга и сторона квадратаСравнить периметр указанных фигур Желательно скрин кода программы

216
Непонятный момент при выводе в консоль

Непонятный момент при выводе в консоль

Здравствуйте, задаю фиксированный размер консоли с помощью

287