Для вашего первого вопроса:
Если вы используете c ++ 17, вы можете сделать это в несколько строк, используя выражение сгиба
#include <iostream>
using namespace std;
template <typename C, typename... Ts>
using matches_my_types = std::bool_constant< ( ... | std::is_same<C,Ts>::value)>;
//or with a predefined set of types..
template <typename C>
using matches_my_predefined_set_of_types = matches_my_types<C,bool,double,int>;
int main() {
using Class = int;
std::cout << matches_my_types<Class,bool,double,int>::value << std::endl;
std::cout << matches_my_predefined_set_of_types<Class>::value << std::endl;
return 0;
}
Демо
Для c ++ 11 вы можете сделать что-то подобное, но с помощью рекурсии вместо сгиба.
#include <iostream>
using namespace std;
template<typename B, typename...Bs> struct any_true
: std::conditional_t<bool(B::value), B, any_true<Bs...>>{};
template<typename B> struct any_true<B> : B {};
template <typename C, typename... Ts>
using matches_my_types = any_true<std::is_same<C,Ts>...>;
int main() {
using Class = int;
std::cout << matches_my_types<Class,bool,double,int>::value << std::endl;
return 0;
}
Демо
ДляВаш второй вопрос: если вы хотите, чтобы обычное удаление const для указателя на const T, вы можете использовать встроенные type_traits и условные,
#include <iostream>
#include <typeinfo>
using namespace std;
template <typename T>
using remove_const_if_pointer_to_const =
std::conditional_t<std::is_pointer<T>::value,
std::add_pointer_t<std::remove_const_t<std::remove_pointer_t<T>>>,
T>;
int main() {
using A = int;
using B = int*;
using C = const int*;
std::cout << typeid(remove_const_if_pointer_to_const<A>).name() << std::endl;
std::cout << typeid(remove_const_if_pointer_to_const<B>).name() << std::endl;
std::cout << typeid(remove_const_if_pointer_to_const<C>).name() << std::endl;
return 0;
}
Demo