2012-07-03 17 views
9

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 .)

Odpowiedz

10

zapomniałeś 'TypeName'

template<typename T> 
constexpr T foo(T a, typename std::make_unsigned<T>::type b) { ... } 

w C++ 14 powinien być w stanie napisać

template<typename T> 
constexpr T foo(T a, std::make_unsigned_t<T> b) { ... } 

Albo możesz to zaimplementować samodzielnie w C++ 11:

template<typename T> 
using make_unsigned_t = typename std::make_unsigned<T>::type; 
+0

Rzeczywiście! Dziękuję bardzo :) – Damon

+0

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

+1

@jww tak, powiedziałbym, że powinno to być własne pytanie. – bames53

Powiązane problemy