여러 가지 방법으로이 작업을 수행 할 수 있습니다. 다른 대답은 당신이 static_assert (가능하면 C++ 11/Boost에서 가능하지만 roll your own)를 사용하여 수행 할 수 있다고 지적했기 때문에 실제로 포인터인지 여부를 확인하고 크기에만 의존하지 않는 것이 좋습니다. 당신은 자신의 롤 또는 (도 사용할 수 in C++11)를 existing trait를 사용하여 어떤 시스템을 사용중인에 따라 할 수 있습니다 :
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를 지원해야한다. 10MB 버퍼 클래스를 옮기는 것은 전혀 비싸지 않아도됩니다. – MSalters