9

クラス宣言が与えられた場合

class A {
    template <typename T> T foo();
};

A::fooのさまざまな型 ( int、...) および型クラス (POD、非 POD)に特化したいと考えていTます。std::enable_if残念ながら、後者には使えないようです。以下はコンパイルされません。

template <> int A::foo<int>(); // OK

template <typename T> 
typename std::enable_if<is_pod<T>::value, T>::type foo(); // <<<< NOT OK!

template <typename T> 
typename std::enable_if<!is_pod<T>::value, T>::type foo(); // <<<< NOT OK!

この問題はおそらくstd::enable_if<...>、関数シグネチャの一部であり、内部でそのようなメンバーを宣言していないことが原因Aです。では、型の特性に基づいてテンプレート メンバーを特殊化するにはどうすればよいでしょうか?

4

2 に答える 2

4

これを構造に転送します。構造はこれをうまく処理します。

#include <type_traits>
#include <iostream>

template <typename T, typename = void>
struct FooCaller;

class A {
public:
    template <typename T>
    T foo() {
        // Forward the call to a structure, let the structure choose 
        //  the specialization.
        return FooCaller<T>::call(*this);
    }
};

// Specialize for PODs.
template <typename T>
struct FooCaller<T, typename std::enable_if<std::is_pod<T>::value>::type> {
    static T call(A& self) {
        std::cout << "pod." << std::endl;
        return T();
    }
};

// Specialize for non-PODs.    
template <typename T>
struct FooCaller<T, typename std::enable_if<!std::is_pod<T>::value>::type> {
    static T call(A& self) {
        std::cout << "non-pod." << std::endl;
        return T();
    }
};

// Specialize for 'int'.
template <>
struct FooCaller<int> {
    static int call(A& self) {
        std::cout << "int." << std::endl;
        return 0;
    }
};
于 2012-10-26T10:33:02.277 に答える
4

ここで専門化する理由はありません。関数をオーバーロードするだけで十分だと思います。

struct A
{
    template <typename T>
    typename std::enable_if<std::is_integral<T>::value, T>::type foo()
    {
        std::cout << "integral" << std::endl;
        return T();
    }

    template <typename T>
    typename std::enable_if<!std::is_integral<T>::value, T>::type foo()
    {
        std::cout << "not integral" << std::endl;
        return T();
    }
}

POD または POD なしをチェックする場合、これら 2 つの選択肢しかないため、より一般的な関数は必要ありません (あいまいになるため、許可されていません)。それ以上必要ですか?の助けを借りて、特殊化せずに明示的な型をチェックできますstd::enable_if<std::is_same<int, T>::value, T>::type

于 2012-10-26T10:48:58.913 に答える