1
這個問題真的沒有背景。用戶自定義轉換的SFINAE
使用SFINAE(直接或間接使用type_traits)檢查現有函數,成員函數等等的方法有很多。但是:
第一個問題:有什麼辦法來檢查一個類是否實現了一個特定的用戶定義的轉換運算符?
爲了說明我的意思,請考慮這段代碼。我想沒有任何斷言失敗運行這段代碼:
#include <type_traits>
#include <cassert>
struct NotADouble {
};
struct Double {
// explicit or not - you decide
explicit operator double() {
return 1.;
}
};
// CORRECT THIS: ...
template<typename T,
class = decltype(static_cast<double>(std::declval<T>()))>
int f(T) {
return 1;
}
int f(...) {
return 2;
}
// ... UNTIL HERE
int main() {
assert(f(NotADouble()) == 2);
assert(f(Double()) == 1);
assert(f(3.) == 2);
assert(f(3) == 2);
assert(f(3.f) == 2);
}
目前執行的f
檢查是否有從T
到double
任何標準的轉換過程,我想這是與在這種情況下std::is_convertible
。
另一種方法是以下實現,它接受前兩個測試。
template<typename T>
int f(T, double (T::*)() = nullptr) {
return 1;
}
int f(...) {
return 2;
}
問題2:即使NotADouble沒有實現任何轉換操作符,它似乎讓這個成員函數指針。因此,究竟是什麼double (T::*)()
以及爲什麼它存在於任何類?
我曾嘗試過類似的測試,但沒有參考,這顯然是不夠的... – overseas
@ user3445587您的意思是'操作符(&)的地址。很遺憾,沒有辦法採用成員函數引用,這顯然是一個缺點,但它直接歸功於C++方法調用語法。例如。在'a.foo();'應該怎樣解釋'foo'?作爲'a'的成員函數或範圍中可用的成員函數引用...? –