W funkcji szablonu, który wygląda tak:Making szablon funkcji parametr unsigned w C++ 11
template<typename T> constexpr T foo(T a, T b) { return /*recursive call*/; }
ja dostaję ostrzeżenie o porównywanie podpisał vs unsigned (ze względu na porównanie przeciwko sizeof
), które ja lubię eliminować.
koncepcyjnej, należałoby coś takiego:
template<typename T> constexpr T foo(T a, unsigned T b) { ... }
or
template<typename T> constexpr T foo(T a, std::make_unsigned<T>::type b) { ... }
Pech chciał, pierwsza wersja nie jest ważny C++, a druga wersja łamie build bo T nie jest kwalifikowany typ gdy kompilator widzi make_unsigned
.
Czy istnieje rozwiązanie tego problemu, które faktycznie działa?
(NB: W jakiś sposób związana/prawie tak samo jak Get the signed/unsigned variant of an integer template parameter without explicit traits, choć funkcji zamiast klasie (więc nie typedefs), cech lub cechy C++ 11 wyraźnie witamy i roztworu roboczego (tj niemake_unsigned<T>
) preferowane .)
Rzeczywiście! Dziękuję bardzo :) – Damon
Mam do czynienia z podobnym problemem dla C++ 03. Chcę dwóch szablonów: jednego dla 'szablonu' and class 'template '. Muszę sprawdzić, czy można rzucić od "T" do "U". Czy istnieje rozwiązanie w świecie C++ 03? (Czy to uzasadnia nowe pytanie)? –
jww
@jww tak, powiedziałbym, że powinno to być własne pytanie. – bames53