c++ - 有没有办法根据模板参数的类型在不同的类实现之间进行选择?
问题描述
例如,我想创建一个数组。数组接受要处理的类型作为模板参数。现在,如果类型是原始类型(int、double、short),则可以使用浅拷贝,而如果它是类,则需要使用类的复制构造函数。如果它是一种简单的方法,我可以在返回值上使用带有 std::enable_if 的 SFAINE,但构造函数并非如此。
我尝试了以下方法,但 GCC-9 给出了编译错误:
template< typename Type, typename std::enable_if< std::is_integral< Type >::value() >::type* = nullptr >
class Array
{
...Implementation...
}
template< typename Type, typename std::enable_if< std::is_integral< Type >::value() == false >::type* = nullptr >
class Array
{
...Implementation 2...
}
此外,我尝试了默认构造函数,但 GCC-9 仍然不满意:
template< typename Type >
class Array
{
Array( typename std::enable_if< std::is_integral< Type >::value() >::type* = nullptr )
{}
Array( typename std::enable_if< std::is_integral< Type >::value() == false >::type* = nullptr )
{}
}
有没有办法根据给定的模板参数的类型创建一个具有不同实现的同名类?
似乎有类似的问题,但我认为不完全是,如果我错了告诉我,我会删除问题
解决方案
借助 SFINAE 进行专业化的方法是为此设置一个模板参数:
template<typename Type, typename Enabler = void> class Array;
template<typename Type>
class Array<Type, typename std::enable_if<std::is_integral< Type >::value() >::type>
{
// ...Implementation 1...
};
template<typename Type>
class Array<Type, typename std::enable_if<!std::is_integral< Type >::value() >::type>
{
// ...Implementation 2...
};
推荐阅读
- c++ - 在编译时计算头文件中的常量
- matlab - 将 .jar 文件添加到 Matlab
- python - Python TypeError:带有functools.partial的多个参数
- python-3.x - “没有模块命名...”从终端运行 python 时
- c# - 实体框架检查孩子是否属于父母
- c - “C 编程语言” - 计数字符异常?
- mpdf - Mpdf - 使用 css 渲染表格
- java - 如果有多个级别的相同 XML 节点,如何循环 JAXB 类
- python - 无法使用 python match() 解析字符串 - 出现错误 AttributeError: 'NoneType' object has no attribute 'group'
- kubernetes - 如何在运行 kubectl port-forward 之前检查 kubelet 的准备情况?