C++ 如果用作非额外参数(例如,对于构造函数),是否可以启用_?
我正在编写一个新的容器,并试图遵守N3485 23.2.3[sequence.reqmts]/14,其中规定: 对于本条和第21条中定义的每个序列容器:C++ 如果用作非额外参数(例如,对于构造函数),是否可以启用_?,c++,stl,template-meta-programming,C++,Stl,Template Meta Programming,我正在编写一个新的容器,并试图遵守N3485 23.2.3[sequence.reqmts]/14,其中规定: 对于本条和第21条中定义的每个序列容器: 如果构造函数 template <class InputIterator> X(InputIterator first, InputIterator last, const allocator_type& alloc = allocator_type()) 然而,boost建议使用初始化为nullptr的伪指
- 如果构造函数
然而,boost建议使用初始化为template <class InputIterator> X(InputIterator first, InputIterator last, const allocator_type& alloc = allocator_type())
的伪指针参数,而不是对函数使用实际参数。这是正确行为所必需的还是前面的nullptr
路径的迭代器范围构造函数的声明可以吗?优秀的机器人(R.Martinho Fernandes)用一个干净的C++11解决方案讨论了这个问题,即在中使用默认模板参数应用
然而,让我在这里指出启用\u if
template< class Type > void foo( typename Something< Type >::T )
挫败了论点演绎 仍然可以通过显式提供模板参数来调用函数。但在C++中编译器将拒绝匹配例如<代码> MyType < /COD>实际参数到形式参数类型<代码>:T/<代码>,因为这可以在某些特殊情况下完成,但不能总是这样做(可能有无数的选择<代码> BLA<代码>:“代码>某处::t/COD> <代码> MyType < /代码>)。模板
void foo(typename Something ::T)
因此,您当前的方法通常不起作用,但是规范需求的整个问题是C++11问题,因此C++11特定的解决方案是可以的!:-) 您不需要滥用返回类型和参数列表:(而且实现可以访问magic,因此如果它真的想避免它们,就不需要任何技巧)@R.MartinhoFernandes:我喜欢您的博客,但只适合那些不想涉入其中的读者,您指出,在C++11中,函数模板可以有一个默认的模板参数,这是一个很好的应用
@R.MartinhoFernandes:这很有趣。不幸的是,MSVC++(我想支持它)还不支持它。给我enable\u if
):(关于推导的观点很好,但请注意,在问题的特定示例中,还有另一个参数具有相同的类型,因此在这种特殊情况下,它实际上可以推导出来。@R.MartinhoFernandes:谢谢,我添加了“一般情况下”:-)我没想到一个关于婴儿名字的网站会包含关于C++11的内容。呵呵,对不起。它只是在我读了关于这本书后用谷歌搜索“GNA”后,在剪贴板上徘徊。谢谢啊,对。“双冒号墙”+1.错误C4519:默认模板参数只允许在类模板上使用(
template< class Type > void foo( typename Something< Type >::T )