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

标签 c++ templates

我有这个队列类,实际上,有几个遇到同样的问题 - 如果使用具有冗长复制构造函数的类型编译,性能会很差 - 队列在推送/弹出期间被锁定,并且时间越长锁定,争用的机会就越大。如果某些开发人员尝试使用 10MB 缓冲区类(而不是指向它的指针)编译该类,那么如果该类无法编译,这将很有用。

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

如果参数不是指向类实例的指针,我可以使用一些方法使我的类无法编译吗?

最佳答案

您可以通过多种方式做到这一点。正如另一个答案指出的那样,您可以使用 static_assert (最好来自 C++11/Boost,尽管您可以 roll your own ),尽管我建议检查它是否实际上是一个指针,而不仅仅是依赖大小。您可以自己滚动或使用 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();
};

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

最后,如果你不想走 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 或确定类型是否为指针的方法。

关于c++ - 为非指针模板类引发异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10142324/

相关文章:

c++ - 避免别名模板部分特化的最佳实践

C++ Template Linked List storing Class Objects - Unhandled Exception Access Violation 读取位置

c++ - 如何避免在模板特化中重新定义类方法?

c++ - 根据模板参数条件创建成员别名 C++17

c++ - c++是一种无空间语言吗?

c++ - 序列化 OpenCV Mat_<Vec3f>

C++:ostream << 运算符错误

c++ - 如何定义可变参数模板的参数?

c++ - 如何在不创建实例的情况下获取类的方法成员的类型?

c++ - Mac 的 McCabe 风格的功能复杂性测试