【发布时间】:2017-01-06 15:39:53
【问题描述】:
我有不同的view 类型,每个类型都有一个std::size_t View::dimension 成员常量和一个typename View::value_type 成员类型。
下面的编译类型检查应该验证From和To是否都是视图(使用is_view<>验证),并且From的内容可以分配给To。 (相同的尺寸和可转换的值类型)。
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 用于带有std::enable_if 的 SFINAE,以禁用成员函数。例如一个视图类可以有一个成员函数
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++17 中,std::conjunction<...> 是否允许这样做?
【问题讨论】:
标签: c++ c++11 sfinae c++17 enable-if