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

标签 c++ templates

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

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

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

在C++中,是否有与此关键字等同的简单名称?

最佳答案

我建议与Boost类型特征库中的static assert一起使用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.

[次要编辑,2013年6月12日:使用已声明但 undefined 的模板将导致链接器(而非编译器)错误消息。]

关于c++ - 仅接受某些类型的C++模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62219689/

相关文章:

c++ - 为什么 GCC 允许私有(private)嵌套模板类/结构从全局模板函数中可见?

c++ - 如何在 Visual Studio C++ 2005 中处理所有#include 指令?

c++ - 将可变数量的参数传递给模板类

c++ - 为 std::bind 创建模板包装器

c++ - pugixml为同一级别的所有子级获取相同的地址

c++ - 如何 Hook AllocMem()、FreeMem() 等...调用?它可以是任何类型的技术 dll、可执行文件等

python - 在构建 python/cython 扩展时指定替代链接器?

c++ - 如何在模板参数上强制执行契约(Contract)

html - CSS Trebuchet MS 与 Photoshop Trebuchet MS

c++ - 在编译时确保 C++ 数组参数大小