2016-12-09 5 views
5

मैं एक समारोह है।सी ++ std :: अधिक प्रकार के लिए enable_if

हालांकि, मैं न केवल int के लिए इस समारोह सक्षम करने की आवश्यकता है, लेकिन float और const char * रूप में अच्छी तरह के लिए ... कैसे एक ही विधि 3x बार लिखे बिना यह करने के लिए?

उत्तर

10

इस तरह:

template <typename T, 
    typename std::enable_if <std::is_same<T, int   >::value || 
          std::is_same<T, float  >::value || 
          std::is_same<T, const char *>::value>::type* = nullptr> 
void test(T i) 
{ 
    //process data 
} 
+0

एक सुझाव। अगर क्वालीफायर ओवरलोडिंग के चयन में कोई फर्क नहीं पड़ता तो शायद कोई 'remove_cv' गधे लगा सकता है। –

+0

@ यानज़ौ चूंकि पैरामीटर 'i' संदर्भ द्वारा पारित नहीं किया गया है, लेकिन मूल्य, स्थिरता और अस्थिरता किसी भी तरह से हटा दी जाएगी। इसलिए, 'टी' सीवी-योग्य नहीं होगा और 'remove_cv' प्रकार के लिए कुछ भी नहीं करेगा। –

2

के लिए सी ++ 17 एक सामान्य समाधान (godbolt.org पर जाँच)

#include <type_traits> 

template< typename U, typename ... Ts > struct belong_to 
{ 
    // before C++17 value will have to be defined recursively on the head of Ts 
    static constexpr bool value = (std::is_same< U, Ts >::value || ...); 
    using type = typename std::enable_if< value, U > ::type; 
}; 

// usage example: 
template< typename T > 
using testable = typename belong_to< T, int, float, const char >::type; 

template< typename T > void test (testable<T> i) 
{ 
    // test process 
} 

int main() 
{ 
    test< int  > (3); 
    test< float  > (3.0); 
    test< const char > ('c'); 
    // test< signed char >(1); does not compile!!! 
} 
1

एक अन्य सामान्य समाधान std :: अलगाव (सी उपयोग करने के लिए है ++ 17) लॉजिकल ओआरएस करने के लिए। स्वीकार्य प्रकार को आपके परीक्षण फ़ंक्शन में कॉल में टेम्पलेट पैरामीटर के रूप में निर्दिष्ट किया गया है, या आप विशेषज्ञता के लिए टाइपिफ़ परिभाषित कर सकते हैं।

#include <iostream> 
#include <type_traits> 

template <typename... Ts, typename T, typename std::enable_if<std::disjunction<std::is_same<T, Ts>...>::value>::type* = nullptr> 
void test(T i) 
{ 
    std::cout << "test\n"; 
} 

int main() 
{ 
    int i = 4; 
    test<int, float, const char*>(i); 
    //test<float, const char*>(i); // compile fails since no int 

    // or use a typedef for the specialization 
    typedef void (*specialized_t)(int); 
    constexpr specialized_t test2 = &test<int, float, const char*>; 
    test2(i); 
} 

run the code

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