2016-03-14 8 views
5

पिछली बार मैंने SFINAE जो void_t सहायक उपयोग करने का सुझाव के बारे में बहुत-से उत्तर संस्थापक हूँ। लेकिन मुझे समझ में नहीं करने के लिए क्या संबंध में इसके बारे में ऐसी क्या खास बात है decltype करने लगता है (..., शून्य())। पर विचार करें उदाहरण:अंतर (..., शून्य()) और void_t

template <typename...> 
using void_t = void; 

template <typename T, typename = void> 
struct has_foo : std::false_type {}; 

template <typename T> 
struct has_foo <T, decltype (T().foo(), void())> : std::true_type {}; 

template <typename T, typename = void> 
struct has_bar : std::false_type {}; 

template <typename T> 
struct has_bar <T, void_t <decltype (T().bar())> > : std::true_type {}; 

class MyClass1 
{ 
public: 
    int foo() { return 3; } 
}; 

class MyClass2 
{ 
public: 
    double bar() { return 5.4; } 
}; 

int main() { 

    std::cout << has_foo<MyClass1>::value << std::endl; 
    std::cout << has_foo<MyClass2>::value << std::endl; 
    std::cout << has_bar<MyClass1>::value << std::endl; 
    std::cout << has_bar<MyClass2>::value << std::endl; 

    return 0; 
} 

उत्पादन दोनों लक्षण है, जो मुझे लगता है कि दोनों कार्यान्वयन ही कर रहे हैं बनाता है के लिए अपेक्षा के अनुरूप है। क्या मैं कुछ भूल रहा हूँ? धन्यवाद।

उत्तर

4

यह एक अधिक अर्थपूर्ण, एक ही बात कह रही है की कम बोझिल रास्ता नहीं है।

यही है।

+0

फर्क सिर्फ इतना है मैं देख रहा हूँ void_t उपयोग कर रहा है, वह हमेशा शून्य हो जाता है, जहां decltype + अल्पविराम ऑपरेटर चाल का उपयोग कर, आप किसी भी प्रकार आप चाहते हैं प्राप्त कर सकते हैं - अपने उदाहरण में आप सिर्फ शून्य चुना है। अन्यथा अपने ही। –

+0

@ TareqA.Siraj: हाँ। –

संबंधित मुद्दे