9

次のようなテンプレート関数で:

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++ ではなく、2 番目のバージョンではビルドが中断されます。これは、コンパイラがmake_unsigned.

実際に機能するこれに対する解決策はありますか?

(注: 何らかの形で Get the signed/unsigned variant of an integer template parameter without explicit traitsとほぼ同じですが、クラスではなく関数 (したがって typedefs はありません)、特性、または C++11 の任意の機能を明示的に歓迎し、動作します解決策 (つまり make_unsigned<T>好ましくない)。

4

1 に答える 1

10

「タイプ名」を忘れました

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;
于 2012-07-03T15:35:16.647 に答える