2

这是一个关于启用函数重载的不同方法的公开讨论,仅在 C++11 模板编译方面借助类型特征或类型的参数启用char函数重载signed charunsigned char

std::enable_if虽然令人满意,但类型断言的复合逻辑std::is_same(请参阅 PS)并不聪明,因为所有匹配类型,特别char是尽管有符号,都用于枚举。因此,我希望有人可以指定一些其他子句或复合逻辑,以更好地促进类型断言(也许std::is_integralstd::is_arithmeticstd::is_signed?)。

PS:

template <typename type>
void foo(std::enable_if<std::is_same<type, char>::value||std::is_same<type, signed char>::value||std::is_same<type, unsigned char>::value, type> x)
{
}
4

2 回答 2

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)
{
} 
于 2012-08-06T22:53:50.090 回答
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/...) ,你可以重用类型特征:

template<typename T>
struct is_some_int {
    enum { value = any_is_same<T, int, signed int, unsigned int>::value };
};

演示在这里

于 2012-08-06T23:06:23.257 回答