標題十分地長的樣子、
我主要是想有兩個類型分別是 A 和 B 的變量 a、b,能否在在編譯期間獲得一個 bool 常量,表示是否擁有 a == b 這樣的運算。
#include <type_traits>
template< typename = static_cast<Dest> std::declval<Src>()))>
__test(
template<typename, typename>
template<typename TA, typename TB>
__implicit_conv =
__static_castable::__test<
std::declval<TA> == std::declval<TB> ), >(
template< typename = std::declval<TA> == std::declval<TB>())>
__implicit_conv<TA, TB> __test(
template<typename, typename>
template<typename A, typename B>
has_equal_operator = std::is_same< decltype(__has_equal_operator_impl::__test<A, B>())> }
然後我們來看看測試的結果
#include <iostream>
template<typename A, typename B>
std::cout << << bw::has_equal_operator<A, B>::value <<
== ( A&, B& A == ( A&, C& D == ( B&, C&
output_result<A, B>
output_result<B, A>
output_result<A, C>
output_result<B, C>
output_result<, >
output_result<, >
output_result<, >
output_result<decltype(std::cout), > }
這有什麼用呢0 0、
你會發現如果你寫了一個類似 delegate 的東西,在刪除函數的時候(如果是仿函數之類的,沒有比較運算符)會得到十分多的編譯錯誤,
有了這個東西我們就可以根據是否有 == 運算符來提供不同的比較行為,有就使用它、沒有就使用自己定義的(比如說比較內存,或者直接 true)
雖然不能保證語義的正確,但是在某些情況下(比如 delegate),還是比較好的。