これはいくつかの方法で行うことができます。別の回答が指摘しているように、 static_assert でそれを行うことができます (できれば C++ 11/Boost から、自分でロールすることもできます) が、サイズだけに依存するのではなく、実際にポインターであるかどうかを確認することをお勧めします。使用しているシステムに応じて、独自の特性をロールするか、既存の特性( C++11でも利用可能) を使用できます。
template <typename T>
struct is_pointer {
enum { value = 0 };
};
template <typename T>
struct is_pointer<T*> {
enum { value = 1 };
};
template <typename T>
struct container {
static_assert(is_pointer<T>::value, "T must be a pointer");
void push(const T&);
T pop();
};
struct foo {};
int main() {
container<foo*> good;
container<foo> fail;
}
しかし、それはより大きなポイントを引き起こします。必要なものだけを指し示すことが必要な場合は、最初からテンプレート パラメーターをそのように解釈してみませんか? たとえば、コンテナを作成します。
template <typename T>
struct container {
void push(const T*);
T *pop();
};
そもそもポインタ以外の型を指定できるようにする代わりに?
最後に、 static_assert の道をたどりたくない場合は、コンテナーをポインター型のみに特化し、非ポインターには実装しないようにすることができます。
template <typename T>
struct container;
template <typename T>
struct container<T*> {
void push(const T*);
T *pop();
};
struct foo {};
int main() {
container<foo*> good;
container<foo> fail;
}
これには、型を明示的にポインターにする必要があり、ポインター以外の型のコンパイル時エラーが発生しますが、 static_assert または型がポインターであるかどうかを判断する方法は必要ありません。