我想檢查是否存在接受T參數類型的非成員函數。爲此,我使用void_t
「技巧」,由Walter E.Brown在cppcon中介紹(同樣的技巧在沒有任何問題的情況下檢查成員類型或成員函數是否存在)。檢查是否存在接受T參數的非成員函數
#include <iostream>
#include <type_traits>
template<typename...>
using void_t = void;
void Serialize(float&)
{
}
template<typename T, typename = void>
struct has_external_serialize : std::false_type
{
};
template<typename T>
struct has_external_serialize<T, void_t<decltype(Serialize(std::declval<T&>()))>> : std::true_type
{
};
void Serialize(int&)
{
}
int main(int argc, const char * argv[])
{
std::cout<<has_external_serialize<float>::value<<has_external_serialize<int>::value;
}
此代碼打印11
時當與鐺(xcode中5.1.1)編譯使用GCC和10
編譯。
我的問題是 - 這段代碼是否正確?如果是的話,clang中有bug還是GCC中的錯誤,或者代碼在某個「實現定義」區域,我不能認爲它會在所有平臺上都有相同的行爲?
在你的專業化之前,支持依賴類型和'std'類型。其他類型使用ADL。然後鏗鏘會很高興。我相信你所做的是不成形的,但沒有時間來證明它 – Yakk 2014-09-10 22:25:20
似乎更像是一個GCC中的錯誤(至少4.9.0),因爲即使對於struct struct_exsert_serialize()))>>:std :: true_type' –
2014-09-10 22:25:50
@Felics:歡迎來到CppCon! :-) – 2014-09-10 23:07:58