私は異なるビュータイプを持っています。タイプはそれぞれstd::size_t View::dimension
メンバー定数とtypename View::value_type
メンバータイプです。 From
とTo
両方は、ビュー(is_view<>
を使用して検証)であり、From
の含有量はTo
に割り当てることができる場合SFINAE std :: enable_if引数
以下コンパイル型チェックが確認しなければなりません。 (同じ次元と変換可能な値の型)。
template<typename From, typename To>
struct is_compatible_view : std::integral_constant<bool,
is_view<From>::value &&
is_view<To>::value &&
From::dimension == To::dimension &&
std::is_convertible<typename From::value_type, typename To::value_type>::value
> { };
is_view<T>
それは常に、あらゆるタイプT
ため、std::true_type
またはstd::false_type
に評価するようなものです。問題は、From
またはTo
がビュータイプでない場合、From::dimension
(たとえば)が存在しない可能性があり、is_compatible_view<From, To>
がコンパイルエラーを引き起こすことです。 この場合、代わりにstd::false_type
と評価する必要があります。
is_compatible_view
は、SFINAEでstd::enable_if
と使用され、メンバ関数を無効にします。たとえば、ビュークラスは、メンバ関数を持つことができます
struct View {
constexpr static std::size_t dimension = ...
using value_type = ...
template<typename Other_view>
std::enable_if_t<is_compatible_view<Other_view, View>> assign_from(const Other_view&);
void assign_from(const Not_a_view&);
};
Not_a_view
は、ビューではなく、is_compatible_view<Not_a_view, ...>
でコンパイルエラーが発生します。 view.assign_from(Not_a_view())
を呼び出すと、SFINAEは適用されず、コンパイラが最初のassign_from
関数を解決しようとすると、コンパイルエラーが発生します。
is_compatible_view
は正しく動作するように書かれていますか? C++ではstd::conjunction<...>
がこれを許可しますか?
私は実際にあなたの最初のスニペットに ':: type'のポイントを実際には見ません。また、ユースケースによっては、 'From :: value_type'などのエラーを直後のコンテキストにプルする' enable_if_compatible_view'エイリアステンプレートを作成すれば十分でしょう。 –