为非指针模板类引发异常?

Mar*_*mes 2 c++ templates

我有这个队列类,实际上,有几个遭受同样的问题 - 如果使用具有冗长拷贝ctor的类型编译,性能将会很差 - 队列在推/弹期间被锁定并且锁定的时间越长,争用的可能性更大.如果某个开发人员尝试使用10MB缓冲区类(而不是指向它的指针)编译它,那么该类将无法编译将是有用的.

似乎没有简单的方法将模板参数限制为基类或任何其他类型.

是否有一些我可以使用的bodge,以便如果参数不是指向类实例的指针,我的类将无法编译?

Fle*_*exo 6

您可以通过多种方式完成此操作.正如另一个答案所指出的,你可以使用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;
}
Run Code Online (Sandbox Code Playgroud)

但这提出了更大的观点.如果您的要求是您只是指向事物,为什么不首先解释模板参数?例如,制作你的容器:

template <typename T>
struct container {
  void push(const T*);
  T *pop();
};
Run Code Online (Sandbox Code Playgroud)

而不是允许人们首先指定非指针类型?

最后,如果你不想沿着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;
}
Run Code Online (Sandbox Code Playgroud)

这仍然需要显式地使类型成为指针,仍然导致非指针类型的编译时失败,但是不需要static_assert或确定类型是否是指针的方式.