我有不同的查看類型,其中每個類型都有一個std::size_t View::dimension
成員常量和一個typename View::value_type
成員類型。SFINAE裏面std :: enable_if參數
以下編譯類型檢查應該驗證如果兩個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>
使得它始終計算爲std::true_type
或std::false_type
,對於任何類型的T
。問題是,如果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++ 17中,std::conjunction<...>
是否允許這樣做?
我其實並沒有在你的第一個片段中看到':: type'的點。另外,根據用例,創建一個'enable_if_compatible_view'別名模板就足夠了,該模板只將'From :: value_type'等中的任何錯誤拖入直接上下文中。 –