Mam funkcję, która jest obecnie przeciążona dla różnych typów danych i pobiera lambdę (wskaźnik funkcji), aby zainicjować te typy danych. Trwają konwersje na instancje szablonów, ale jeszcze się nie udało.Konwersja przeciążonych funkcji do wyspecjalizowanych szablonów funkcji
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;
}
Zauważ, że Wziąłem przykład z int
i double
dla uproszczenia, mogą być pewne zupełnie różne (i skomplikowane) typy w rzeczywistym kodzie.
#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;
}
Również podczas wywoływania funkcji na matrycy, jeśli nie mam do przekazania <any type hints>
do funkcji, które byłyby znacznie lepsze rozwiązanie.
'szablon <> void doSome (F & func)' jest źle, a nawet jeśli masz napisane szablonu void funkcja 'doSome (F & funkcjono)', nie można częściowo specjalizują szablony –
xinaiz
Jestem po prostu ciekawy, dlaczego chcesz przekonwertować z przeciążenia, do specjalizacji szablonów? Przeciążanie jest zazwyczaj ładniejsze i mniej zaskakujące niż specjalizacje szablonów funkcji. Przeciążenie jest powodem, dla którego nie potrzebujesz częściowej specjalizacji dla szablonów funkcji. Moja rada dla kogoś polegałaby na tym, aby w miarę możliwości unikać szablonów funkcji. Czy to możliwe, że jest to problem XY? –
Wskaźniki funkcji @NirFriedman działają tylko w przypadku niezapisujących lambd i to bardzo ogranicza. 'std :: function' rozwiązałoby to i używałem go wszędzie, ale te funkcje są krytyczne dla wydajności i testy wskazują, że wskaźniki funkcji są znacznie szybsze w naszym przypadku, więc .. –