返利網(wǎng)網(wǎng)站怎么做北京seo推廣服務
類型特性
類型特性定義一個編譯時基于模板的結(jié)構(gòu),以查詢或修改類型的屬性。
試圖特化定義于 <type_traits> 頭文件的模板導致未定義行為,除了 std::common_type 可依照其所描述特化。
定義于<type_traits>頭文件的模板可以用不完整類型實例化,除非另外有指定,盡管通常禁止以不完整類型實例化標準庫模板。
類型屬性
檢查類型是否擁有強結(jié)構(gòu)相等性
std::has_strong_structural_equality
template< class T > | (C++20 起) |
若 T
擁有強結(jié)構(gòu)相等性,則提供等于 true 的成員常量 value
。對于任何其他類型 value
為 false 。
模板形參
T | - | 要檢查的類型 |
輔助變量模板
template< class T > | (C++20 起) |
繼承自 std::integral_constant
成員常量
value [靜態(tài)] | 若 T 擁有強結(jié)構(gòu)相等性則為 true ,否則為 false(公開靜態(tài)成員常量) |
成員函數(shù)
operator bool | 轉(zhuǎn)換對象為 bool ,返回 value (公開成員函數(shù)) |
operator() (C++14) | 返回 value (公開成員函數(shù)) |
成員類型
類型 | 定義 |
value_type | bool |
type | std::integral_constant<bool, value> |
注解
此類型特征可用于檢查一個類型能否用作非類型模板形參。
調(diào)用示例
#include <type_traits>
#include <cstring>
#include <algorithm>
#include <iostream>namespace std
{
template<typename... Ts> struct make_void
{typedef void type;
};
template<typename... Ts> using void_t = typename make_void<Ts...>::type;template <typename T, typename = void>
struct has_strong_structural_equality : std::false_type {};template <typename T>
struct has_strong_structural_equality<T, std::void_t<decltype(std::declval<T>() == std::declval<T>())>> : std::true_type
{template<typename, typename>static std::false_type test(...);using type = decltype(test<T, T>(0));
};template<typename T, typename U>
using has_strong_structural_equality_t = typename has_strong_structural_equality<T, U>::type;template <typename T>
const bool has_strong_structural_equality_v = has_strong_structural_equality<T>::value;
}class E
{
public:template<class T> E(T&&) { }
};class A {};
class B : public A {};
class C {};
class D
{
public:operator C(){return c;} C c;
};struct MyStruct
{int x;double y;
};// 自定義比較運算符
bool operator==(const MyStruct& lhs, const MyStruct& rhs)
{return lhs.x == rhs.x && lhs.y == rhs.y;
}int main()
{std::cout << std::boolalpha;std::cout << "std::has_strong_structural_equality<A>::value: "<< std::has_strong_structural_equality<A>::value << std::endl;std::cout << "std::has_strong_structural_equality<E>::value: "<< std::has_strong_structural_equality<E>::value << std::endl;std::cout << "std::has_strong_structural_equality<float>::value: "<< std::has_strong_structural_equality<float>::value << std::endl;std::cout << "std::has_strong_structural_equality<int>::value: "<< std::has_strong_structural_equality<int>::value << std::endl;std::cout << "std::has_strong_structural_equality<char>::value: "<< std::has_strong_structural_equality<char>::value << std::endl;std::cout << "std::has_strong_structural_equality<bool>::value: "<< std::has_strong_structural_equality<bool>::value << std::endl;std::cout << "std::has_strong_structural_equality<MyStruct>::value:"<< std::has_strong_structural_equality<MyStruct>::value << std::endl;std::cout << "-----------------------------------------------" << std::endl;std::cout << std::endl;return 0;
}
輸出
std::has_strong_structural_equality<A>::value: false
std::has_strong_structural_equality<E>::value: false
std::has_strong_structural_equality<float>::value: true
std::has_strong_structural_equality<int>::value: true
std::has_strong_structural_equality<char>::value: true
std::has_strong_structural_equality<bool>::value: true
std::has_strong_structural_equality<MyStruct>::value:true
-----------------------------------------------