zacząć, mam coś takiego:C++: Wniosek/wskaźnik zarejestrował zmienną jako parametr szablonu
class Test {
std::vector<int> a, b;
void caller(...) { callee(...); }
void callee(...) { /* Do stuff with 'a' */ }
}
Chciałem ma mieć funkcję, która robi dokładnie to samo callee
ale dla wektora b
. Aby to zrobić, istnieją dwie oczywiste rozwiązania:
- Przełęcz wektorowe
a
lubb
jako argument. Jednakże,callee
jest funkcją rekursywną, która może służyć do setek wywołań, a przekazywanie wektorów jako argumentów byłoby niepotrzebne narzut. - Skopiuj funkcję
callee
i użyj wektorab
, która byłaby najlepszą alternatywą, mimo żecallee
jest dość długą funkcją i miałbym dużo duplikatu kodu.
Z ciekawości poszedłem szukając części szablonów i zauważyłem, że może być stosowany do
lvalue reference type
pointer type
pointer to member type
Więc starałem się to zrobić:
class Test {
std::vector<int> a, b;
void caller(...) { callee<a>(...); }
template <std::vector<int> &x> void callee(...) { /* Do stuff with 'x' */ }
}
ale mam
error: use of ‘this’ in a constant expression
Czy można to osiągnąć za pomocą polecenia ence lub wskaźnik?
Nawiasem mówiąc, co chcę, może być postrzegane jako funkcja-scoped #define
"i przekazywanie wektorów jako argumentów byłoby niepotrzebnym obciążeniem" Nie sądzę, że zauważysz nawet "obciążenie", gdy przekażesz wektor przez odniesienie lub wskaźnik. –
Cóż, tak. Ale wolałbym raczej wybrać drugie rozwiązanie i nie mieć żadnych kosztów ogólnych. – gmardau
Jeśli chcesz używać tego szablonu w sposób restrykcyjny, powinieneś zrobić 'template' i gdziekolwiek używasz tego typu, zaakceptuj 'T &' - jeśli musisz zapobiec używaniu go, powiedz 'std: : vector 'następnie użyj' std :: enable_if' dla niezgodnego. –
Olipro