簡體   English   中英

在C ++ 11中使函數模板參數無符號

[英]Making function template parameter unsigned in C++11

在模板函數中,如下所示:

template<typename T> constexpr T foo(T a, T b) { return /*recursive call*/; }

我收到一個關於比較已簽名與未簽名(由於與sizeof進行比較)的警告,我想刪除它。

從概念上講,人們需要這樣的東西:

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

不幸的是,第一個版本不是有效的C ++,第二個版本打破了構建,因為當編譯器看到make_unsigned時T不是限定類型。

是否有解決方案實際上有效?

(注意:以某種方式與獲取整數模板參數的有符號/無符號變體沒有顯式特征相關/幾乎相同,雖然函數而不是類(因此沒有typedef),特征或C ++ 11的任何特性明確歡迎,並且正在工作解決方案(即不是 make_unsigned<T> )首選。)

你忘記了'typename'

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

在C ++ 14中,您應該能夠編寫

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

或者您可以在C ++ 11中自己實現:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM