前提・実現したいこと
基本型のMIN,MAX値が.NETのようにまとまってないことに不便を感じたので、コンセプトとテンプレートの練習も兼ねて書いてみることにしました。
基本的なコンストラクタなどは同じ振る舞いなので、共通化して、BoolとINTで演算系が違うのでそれぞれ特殊化する方針で考えています。
それが、以下のソースになります。
該当のソースコード
C++
1namespace ClassedValue{ 2 /** 3 * @brief 整数型(Boolを除く)であることを示すコンセプトです。 4 * 5 * @tparam T 調査対象クラス 6 */ 7 template <class T> 8 concept IsIntegerWithoutBool = std::is_integral_v<T> && !std::is_same_v<bool, T>; 9 10 11 /*基本テンプレート*/ 12 template <class T> 13 class BasicValueObject final 14 { 15 private: 16 T value; 17 18 constexpr BasicValueObject() noexcept : value(T{}){}; 19 constexpr BasicValueObject(const BasicValueObject& obj) noexcept : value(obj.value){}; 20 constexpr BasicValueObject(const T& obj) noexcept : value(obj){}; 21 }; 22 23 24 template <> 25 class BasicValueObject<bool> 26 { 27 private: 28 bool value; 29 /*中略 BOOL系演算定義 */ 30 }; 31 32 /*整数型はこの部分特殊化を経由してほしい*/ 33 template <IsIntegerWithoutBool T, T& Min, T& Max> 34 class BasicValueObject<T> //ここでエラー 35 { 36 public: 37 constexpr T Minvalue = Min; 38 constexpr T Maxvalue = Max; 39 /*中略 整数系演算定義 */ 40 } 41 42 //こんなかんじで定義したい 43 using Bool = BasicValueObject<bool>; 44 using Int8 = BasicValueObject<int8_t, INT8_MIN, INT8_MAX>; 45 using Uint8 = BasicValueObject<uint8_t, UINT8_MIN, UINT8_MAX>; 46 using Byte = Uint8; 47 using Int16 = BasicValueObject<int16_t, INT16_MIN, INT16_MAX>; 48 using Uint16 = BasicValueObject<uint16_t, UINT16_MIN, UINT16_MAX>; 49 using Int32 = BasicValueObject<int32_t, INT32_MIN, INT32_MAX>; 50 using Uint32 = BasicValueObject<uint32_t, UINT32_MIN, UINT32_MAX>; 51 using Int32 = BasicValueObject<int32_t, INT32_MIN, INT32_MAX>; 52 using Uint32 = BasicValueObject<uint32_t, UINT32_MIN, UINT32_MAX>; 53}
発生している問題・エラーメッセージ
template parameters not deducible in partial specialization:GCC
参考URL
以下のページを参考にしています。
https://programming-place.net/ppp/contents/cpp/language/023.html#partial_specialization
補足情報(FW/ツールのバージョンなど)
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-pc-linux-gnu/10.1.0/lto-wrapper
ターゲット: x86_64-pc-linux-gnu
configure 設定: /build/gcc/src/gcc/configure --prefix=/usr --libdir=/usr/lib --libexecdir=/usr/lib --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=https://bugs.archlinux.org/ --enable-languages=c,c++,ada,fortran,go,lto,objc,obj-c++,d --with-isl --with-linker-hash-style=gnu --with-system-zlib --enable-__cxa_atexit --enable-cet=auto --enable-checking=release --enable-clocale=gnu --enable-default-pie --enable-default-ssp --enable-gnu-indirect-function --enable-gnu-unique-object --enable-install-libiberty --enable-linker-build-id --enable-lto --enable-multilib --enable-plugin --enable-shared --enable-threads=posix --disable-libssp --disable-libstdcxx-pch --disable-libunwind-exceptions --disable-werror gdc_include_dir=/usr/include/dlang/gdc
スレッドモデル: posix
Supported LTO compression algorithms: zlib zstd
gcc バージョン 10.1.0 (GCC)
よろしくおねがいします。
回答2件
あなたの回答
tips
プレビュー