Добрый день.
Пусть есть шаблонная функция (примеры не транслировал):
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;}
Вопрос:
Спасибо.
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);}
Но при этом получается лишний вызов.
Итак, снова тот же вопрос:
Можно не заморачиваться:
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>;
Виртуальный выделенный сервер (VDS) становится отличным выбором
Нужно написать dll которая будет детектить процессы по имени окна и классамИ закрывать приложение в которое она подключена после детекта...
Мне нужна программа на с++ Дано радиус круга и сторона квадратаСравнить периметр указанных фигур Желательно скрин кода программы
Здравствуйте, задаю фиксированный размер консоли с помощью