C ++ - std :: enable_if for other types

I have a function:

template <typename T, typename std::enable_if <std::is_same<T, int>::value == true>::type* = nullptr> void test(T i) { //process data } 

He works.

However, I need to enable this function not only for int , but also for float and const char * ... how to do this without writing the same method 3 times?

+5
source share
3 answers

Like this:

 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 } 
+10
source

General solution for C ++ 17 (tested at 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!!! } 
+2
source

Another common solution is to use std :: disjunction (C ++ 17) to execute logical ORs. Valid types are specified as template parameters when calling your test function, or you can define a typedef for specialization.

 #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

+1
source

Source: https://habr.com/ru/post/1261031/


All Articles