这是一个公开的讨论,关于在{+ 1}},char
或signed char
类型的参数上启用函数重载的不同方法,借助于C ++ 11中的类型特征模板编译。
虽然令人满意,unsigned char
和std::enable_if
类型断言(参见PS)的复合逻辑并不聪明,因为所有匹配类型,特别是std::is_same
,尽管有签名,都用于列举。因此,我希望有人可以指定一些可能更好地促进类型断言的其他子句或复合逻辑(可能是char
,std::is_integral
或std::is_arithmetic
?)。
PS:
std::is_signed
答案 0 :(得分:2)
如果你想要这样的类型特征,你必须自己制作一个:
template <typename T>
struct is_char
{
static const bool value = std::is_same<T, char>::value ||
std::is_same<T, signed char>::value ||
std::is_same<T, unsigned char>::value;
};
template <typename T>
void f(T t, typename std::enable_if<is_char<T>::value>::type* = 0)
{
}
答案 1 :(得分:1)
杰西已经提供了解决方案,但无论如何我都会离开这里。
// Tests whether the first template argument is equal to at least
// one of the rest of them
// e.g. any_is_same<int, char, bool, int>::value == true
// e.g. any_is_same<int, char, bool, std::string>::value == false
template<typename...>
struct any_is_same;
// Base cases
template<typename T, typename... Types>
struct any_is_same<T, T, Types...> {
enum { value = true };
};
template<typename T>
struct any_is_same<T> {
enum { value = false };
};
// Recursive
template<typename T, typename Head, typename... Tail>
struct any_is_same<T, Head, Tail...> {
enum { value = any_is_same<T, Tail...>::value };
};
// Helper
template<typename T>
struct is_some_char {
enum { value = any_is_same<T, char, signed char, unsigned char>::value };
};
template <typename type, typename std::enable_if<is_some_char<type>::value, int>::type = 0>
void foo(type x)
{
}
如果您假装对其他类型(例如any_is_same
/ int
/ unsigned int
/ ...)执行相同操作,则可以重复使用signed int
类型特征:< / p>
template<typename T>
struct is_some_int {
enum { value = any_is_same<T, int, signed int, unsigned int>::value };
};
演示here。