У меня есть функция, которая в настоящее время перегружена для разных типов данных и принимает лямбда (указатель функции) для инициализации этих типов данных. Я собираюсь преобразовать их в экземпляры шаблонов, но пока не удалось.Преобразование перегруженных функций в специализированные шаблоны функций
Here's the overloaded version -
#include <iostream>
using namespace std;
void doSome(int (*func)(int &)){
int a;
a = 5;
int res = func(a);
cout << a << "\n";
}
void doSome(int (*func)(double &)){
double a;
a = 5.2;
int res = func(a);
cout << a << "\n";
}
int main() {
doSome([](int &a){
a += 2;
return 1;
});
doSome([](double &a){
a += 2.5;
return 1;
});
return 0;
}
Обратите внимание, что я взял пример из int
и double
для упрощения, они могут быть некоторые совершенно разные (и сложные) типы в настоящем коде.
#include <iostream>
using namespace std;
template <typename F, typename S>
void doSome(F &func){
S a;
auto res = func(a);
cout << res << "\n";
}
template<>
void doSome<typename F, int> (F &func){
int a;
a = 5;
auto res = func(a);
cout << res << "\n";
}
template<>
void dpSome<typename F, double> (F &func){
double a;
a = 5.5
auto res = func(a);
cout << res << "\n";
}
int main() {
doSome([](int &a){
a += 2;
return 1;
});
doSome([](double &a){
a += 2.5;
return 1;
});
return 0;
}
Также при вызове шаблонных функций, если я не должен проходить <any type hints>
функции, что будет гораздо лучшим решением.
'шаблон <> аннулируется doSome <имяТип F, Int> (F & FUNC)' неправильно, и даже если вы написали 'шаблон недействительной doSome (F & Func)', вы не можете частично специализировать функцию templates –
xinaiz
Мне просто интересно, почему вы хотите конвертировать из перегрузки, в специализированную специализацию? Перегрузка обычно лучше и менее неожиданна, чем специализированные шаблоны. Перегрузка - причина, по которой вам не требуется частичная специализация для шаблонов функций. Мой совет кому-то будет заключаться в том, чтобы избежать специализированных шаблонов функций, где это возможно. Возможно ли, что это проблема XY? –
Указатели функции @NirFriedman работают только для не-захвата лямбда, и это очень ограничивает. 'std :: function' решил бы это, и я использовал его везде, но эти функции критичны по производительности, а эталонные указатели указателей функций будут намного быстрее в нашем случае, поэтому .. –