enable_if是否可以用作非额外参数(例如,用于构造函数)
Can enable_if be used as a non-extra parameter (e.g. for a constructor)?
我正在编写一个新的容器,并试图遵守N3485 23.2.3 [sequence.reqmts]/14
,它声明:
对于本条款和第21条中定义的每个序列容器:
如果构造函数
template <class InputIterator> X(InputIterator first, InputIterator last, const allocator_type& alloc = allocator_type())
使用类型
InputIterator
调用,该类型不符合输入迭代器,则构造函数不应参与重载决议
(对于采用迭代器范围的成员函数,/14
几乎逐字逐句地重复这一点)
N3485 23.2.3 [sequence.reqmts]/15
说:
实现确定一个类型不能是输入迭代器的程度是未指定的,除非作为最低限度的积分类型不符合输入迭代者的条件。
我的理解是,短语"不应参与重载解决"意味着容器实现者应该在模板参数推导过程中使用SFINAE技巧禁用该构造函数或成员函数。对于成员功能而言,这没什么大不了的;因为函数的返回类型是使用CCD_ 5的正常方式。但是对于构造函数,没有可以应用enable_if
的返回类型。这是我第一次尝试声明构造函数:
// The enable_if use below is to comply with 23.2.3 [sequence.reqmts]/14:
// ... is called with a type InputIterator that does not qualify as an input iterator
// then the constructor shall not participate in overload resolution.
template <typename InputIterator>
path(std::enable_if<!std::is_integral<InputIterator>::value, InputIterator>::type first,
InputIterator last, Allocator const& allocator = allocator_type());
然而,boost的enable_if
文档建议使用初始化为nullptr
的伪指针参数,而不是使用函数的实际参数。这是正确行为所必需的吗?还是path
的迭代器范围构造函数的前面声明可以?
The Good Robot(R.Martinho Fernandes)在他的博客中讨论了一个干净的C++11解决方案的问题,即使用默认模板参数应用enable_if
。
然而,让我在这里指出,做
template< class Type >
void foo( typename Something< Type >::T )
反对论点推导。
仍然可以通过显式提供模板参数来调用函数。但在C++中,编译器将简单地拒绝将例如MyType
实际参数与形式参数类型Something<Blah>::T
进行匹配,因为尽管在某些特殊情况下可以这样做,但它不能总是这样做(Blah
可能有无数种选择,其中Something<Blah>::T
是MyType
)。
因此,您当前的方法一般不起作用,但规范要求的整个问题是C++11问题,因此C++11特定的解决方案是可以的!:-)
- 如何反转整数参数包
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 如何使用默认参数等选择模板专业化
- 模板参数替换失败,并且未完成隐式转换
- 具有默认模板参数的多态类的模板推导失败
- 在标准中,模板参数的语法在哪里定义,例如,'std::function<int(char)>'?
- 指向(数据)成员的指针作为非类型模板参数,例如具有自动存储持续时间/无链接
- 是否可以交换在 c++ 中作为函数 func(say) 中的参数传递的 const 向量的两个元素,例如:vector<int>func (const vector<int>&
- 使用参数的可变大小向量格式化字符串(例如,将参数向量传递给 std::snprintf)
- 指针符号在参数规范中表示什么,例如:(char16 *缓冲区,int32 大小)?C++
- 是否可以将指针传递给运算符,作为一个参数,例如指向函数的指针
- 使用ENABLE_IF和SFINAE时,功能参数类型扣除(std容器,例如向量)失败
- 有没有办法用参数替换字符串,例如 C++ 中的 printf
- 从BASH脚本发送一些参数(例如Ctrl-C,3,Some_string)
- 为什么lambda函数用于stl函数,例如sort(),c 中的max_element()函数以两个参数为输入
- enable_if是否可以用作非额外参数(例如,用于构造函数)
- 如何使用某些参数展开某个循环,例如 GCC 中的最大展开时间
- 为什么不能使用 auto 作为模板类型参数(例如 std::array<auto, 5>)?
- 如何使用COM智能指针作为内外参数来调用例如库函数
- linux/gcc的C?(例如,前向扫描,opt参数)