これはいくつかの方法で行うことができます。別の答えとして、static_assert(できればroll your ownでも可能ですが、C++ 11/Boostから)を使うことができますが、実際にはポインタでありサイズだけに依存していないかどうかを確認することをおすすめします。あなたは、独自のロールまたは使用しているもののシステムに応じて、existing trait(あまりにも利用可能in 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();
};
最初に非ポインタ型を指定できるようにするのではなく、
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の道を行くにしたくない場合は最後に
ポインタをタイプすると、非ポインタ型のコンパイル時に失敗しますが、static_assertや型がポインタであるかどうかを判断する必要はありません。
あなたはおそらく、その後、移動ctorsをサポートする必要があります。 10 MBのバッファークラスを移動することは、まったく高価である必要はありません。 – MSalters