2

charこれは、C ++ 11テンプレートのコンパイルに関して、型の特性を利用して、signed charまたはunsigned char型のパラメーターに対してのみ関数のオーバーロードを有効にするさまざまな方法についてのオープンな議論です。

満足のいくものですがstd::enable_ifstd::is_sameタイプアサーション(PSを参照)の複合ロジックは、特にchar符号付きにもかかわらず、すべての一致するタイプが列挙に使用されるという点で賢くはありません。したがって、誰かが型アサーションをより容易にする可能性のある他の句または複合ロジックを指定できることを望んでいます(多分std::is_integralstd::is_arithmeticまたはstd::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でも同じように振る舞う場合は、タイプ特性を再利用できます。intunsigned intsigned 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 に答える