मैं यह जांचना चाहता हूं कि एक गैर-सदस्य फ़ंक्शन जो टी पैरामीटर प्रकार स्वीकार करता है या नहीं। ऐसा करने के लिए मैंने void_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) के साथ संकलित जीसीसी और 10
का उपयोग कर संकलित।
मेरे प्रश्न है - क्या यह कोड सही है? यदि हां, क्या क्लैंग या जीसीसी में एक बग में कोई बग है या कोड कुछ "कार्यान्वयन परिभाषित" क्षेत्र में है और मुझे लगता है कि यह सभी प्लेटफॉर्म पर समान व्यवहार नहीं करेगा?
अपनी विशेषज्ञता से पहले निर्भर प्रकार, और 'std' प्रकार चिपकाएं। अन्य प्रकार एडीएल का उपयोग करें। तब clang खुश हो जाएगा।मेरा मानना है कि आपने जो किया वह बीमार है, लेकिन इसे साबित करने के लिए समय नहीं है – Yakk
जीसीसी (कम से कम 4.9.0) में एक बग की तरह लगता है, क्योंकि यह '11' प्रिंट करता है, 'struct_external_serialize())) >> std :: true_type' –
@ फ़ेलिक्स: CppCon में आपका स्वागत है! :-) –