Dlaczego domyślne argumenty szablonów są dozwolone tylko w szablonach klas? Dlaczego nie możemy zdefiniować domyślnego typu w szablonie funkcji członka? Na przykład:
struct mycclass {
template<class T=int>
void mymember(T* vec) {
// ...
}
};
Zamiast tego C ++ wymusza, aby domyślne argumenty szablonu były dozwolone tylko w szablonie klasy.
struct S { template <class R = int> R get_me_R() { return R(); } };
parametru szablonu nie można wywnioskować z kontekstu.template <int N = 1> int &increment(int &i) { i += N; return i; }
, a następnieincrement(i);
lubincrement<2>(i);
. W tej chwili muszę pisaćincrement<1>(i);
.Odpowiedzi:
Podanie domyślnych argumentów szablonu ma sens. Na przykład możesz utworzyć funkcję sortowania:
C ++ 0x wprowadza je do C ++. Zobacz ten raport wady Bjarne Stroustrup: Argumenty szablonów domyślnych dla szablonów funkcji i jego wypowiedzi
źródło
double
w moim przypadku). Być może nie jest to „ogólne”, ale czy ta praktyka ma jakąś wadę? Dzięki.error: invalid conversion from ‘int’ to ‘int*’
żadnego, dlaczego: Iterator beg, Iterator end, Comp c = Comp ()) {std :: sort (beg, end, c); } int main () {std :: array <int, 5> ar {5,2,21,7,4}; my_sort (ar.begin (), ar.end ()); } `Cytować szablony C ++: Kompletny przewodnik (strona 207):
źródło
Do tej pory wszystkie podane przykłady domyślnych parametrów szablonów dla szablonów funkcji można wykonać z przeciążeniem.
ARAK:
możliwe:
Mój własny:
możliwe:
litb:
możliwe:
Stroustrup:
Możliwe:
Co udowodniłem za pomocą następującego kodu:
Wydrukowany wynik odpowiada komentarzom dla każdego wywołania f, a wykomentowane wywołanie nie kompiluje się zgodnie z oczekiwaniami.
Podejrzewam więc, że domyślne parametry szablonu „nie są potrzebne”, ale prawdopodobnie tylko w tym samym sensie, że domyślne argumenty funkcji „nie są potrzebne”. Jak wskazuje raport defektów Stroustrupa, dodanie niededykowanych parametrów było zbyt późno, aby ktokolwiek zdał sobie sprawę i / lub naprawdę docenił, że sprawiło, że domyślne były przydatne. Obecna sytuacja jest więc oparta na wersji szablonów funkcji, która nigdy nie była standardowa.
źródło
template<typename T = void> int SomeFunction();
. Parametr szablonu tutaj nigdy nie jest używany, a funkcja nigdy nie jest wywoływana; jedyne miejsce, do którego się to odnosi, to wdecltype
lubsizeof
. Nazwa celowo pasuje do nazwy innej funkcji, ale fakt, że jest szablonem, oznacza, że kompilator będzie preferował funkcję bezpłatną, jeśli istnieje. Oba są używane w SFINAE, aby zapewnić domyślne zachowanie w przypadku braku definicji funkcji.W systemie Windows we wszystkich wersjach programu Visual Studio można przekonwertować ten błąd ( C4519 ) na ostrzeżenie lub wyłączyć go w następujący sposób:
Zobacz więcej szczegółów tutaj .
źródło
Używam następnej sztuczki:
Powiedzmy, że chcesz mieć taką funkcję:
Nie będziesz miał pozwolenia, ale robię to w następujący sposób:
W ten sposób możesz użyć go w następujący sposób:
Jak widzimy, nie ma potrzeby jawnego ustawiania drugiego parametru. Może przyda się komuś.
źródło