小编典典

仅接受某些类型的 C++ 模板

all

在 Java 中,您可以定义只接受扩展您选择的类的类型的泛型类,例如:

public class ObservableList<T extends List> {
  ...
}

这是使用“扩展”关键字完成的。

C ++中是否有一些与此关键字等效的简单方法?


阅读 65

收藏
2022-07-28

共1个答案

小编典典

我建议结合Boost Type Traits 库中的
Boost静态断言功能:is_base_of

template<typename T>
class ObservableList {
    BOOST_STATIC_ASSERT((is_base_of<List, T>::value)); //Yes, the double parentheses are needed, otherwise the comma will be seen as macro argument separator
    ...
};

在其他一些更简单的情况下,您可以简单地前向声明一个全局模板,但只为有效类型定义(显式或部分特化)它:

template<typename T> class my_template;     // Declare, but don't define

// int is a valid type
template<> class my_template<int> {
    ...
};

// All pointer types are valid
template<typename T> class my_template<T*> {
    ...
};

// All other types are invalid, and will cause linker error messages.

[次要编辑 6/12/2013:使用声明但未定义的模板将导致 链接器 ,而不是编译器,错误消息。]

2022-07-28