मैं एक समारोह है।सी ++ std :: अधिक प्रकार के लिए enable_if
हालांकि, मैं न केवल int
के लिए इस समारोह सक्षम करने की आवश्यकता है, लेकिन float
और const char *
रूप में अच्छी तरह के लिए ... कैसे एक ही विधि 3x बार लिखे बिना यह करने के लिए?
मैं एक समारोह है।सी ++ std :: अधिक प्रकार के लिए enable_if
हालांकि, मैं न केवल int
के लिए इस समारोह सक्षम करने की आवश्यकता है, लेकिन float
और const char *
रूप में अच्छी तरह के लिए ... कैसे एक ही विधि 3x बार लिखे बिना यह करने के लिए?
इस तरह:
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
}
के लिए सी ++ 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!!!
}
एक अन्य सामान्य समाधान 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);
}
एक सुझाव। अगर क्वालीफायर ओवरलोडिंग के चयन में कोई फर्क नहीं पड़ता तो शायद कोई 'remove_cv' गधे लगा सकता है। –
@ यानज़ौ चूंकि पैरामीटर 'i' संदर्भ द्वारा पारित नहीं किया गया है, लेकिन मूल्य, स्थिरता और अस्थिरता किसी भी तरह से हटा दी जाएगी। इसलिए, 'टी' सीवी-योग्य नहीं होगा और 'remove_cv' प्रकार के लिए कुछ भी नहीं करेगा। –