2

テンプレートクラスがあるとします

template <typename T>
class MyTem{
public:
    bool is_T_Pointer(){
        <...>
    }
};
class Cls : MyTem<Cls>{
    <...>
};
int main(void){
    Cls* classOnHeap = new Cls(); /* T is pointer */
    Cls classOnStack; /* T is not pointer */
    <...>
}

これは悪い例ですが、誰かがTがテンプレートクラスからのポインタであるかどうかを調べるのを手伝ってくれるなら、それは素晴らしいことです。

基本クラスと同じクラスのテンプレートで継承があることを忘れないでください。

完全な実装である必要はありません。漠然とした手法で十分です。

4

2 に答える 2

5

ここでは部分的な特殊化を採用する必要があります。

template<class T>
class A
{
public:
    A() {}
};

template<class T>
class A<T*>
{
public:
    A(int) {}
};

次に、コンパイラはテンプレートのポインタバージョンを選択するように強制され、デフォルトのコンストラクタがないため、以下はコンパイルされません。

A<char*> a;

これはコンパイルされます:

A<char> a;
于 2012-08-10T09:47:22.560 に答える
3

コンパイラがC++11をサポートしている場合は、次を使用してstd::is_pointerください。

#include <iostream>
#include <type_traits>

template <typename T>
class MyTem
{
public:
    static const bool IS_POINTER = std::is_pointer<T>::value;
};

int main()
{
    std::cout << MyTem<char*>::IS_POINTER << "\n";
    std::cout << MyTem<char>::IS_POINTER << "\n";
    return 0;
}

デモhttp://ideone.com/Mo394を参照してください。

于 2012-08-10T09:37:09.250 に答える