Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如果用作非额外参数(例如,对于构造函数),是否可以启用_?_C++_Stl_Template Meta Programming - Fatal编程技术网

C++ 如果用作非额外参数(例如,对于构造函数),是否可以启用_?

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的伪指

我正在编写一个新的容器,并试图遵守N3485 23.2.3[sequence.reqmts]/14,其中规定:

对于本条和第21条中定义的每个序列容器:

  • 如果构造函数

    template <class InputIterator>
    X(InputIterator first, InputIterator last, 
         const allocator_type& alloc = allocator_type())
    
    然而,boost建议使用初始化为
    nullptr
    的伪指针参数,而不是对函数使用实际参数。这是正确行为所必需的还是前面的
    路径的迭代器范围构造函数的声明可以吗?

    优秀的机器人(R.Martinho Fernandes)用一个干净的C++11解决方案讨论了这个问题,即在中使用默认模板参数应用
    启用\u if

    然而,让我在这里指出

        template< class Type >
        void foo( typename Something< Type >::T )
    
    模板
    void foo(typename Something::T)
    
    挫败了论点演绎

    仍然可以通过显式提供模板参数来调用函数。但在C++中编译器将拒绝匹配例如<代码> MyType < /COD>实际参数到形式参数类型<代码>:T/<代码>,因为这可以在某些特殊情况下完成,但不能总是这样做(可能有无数的选择<代码> BLA<代码>:“代码>某处::t/COD> <代码> MyType < /代码>)。
    因此,您当前的方法通常不起作用,但是规范需求的整个问题是C++11问题,因此C++11特定的解决方案是可以的!:-)

    您不需要滥用返回类型和参数列表:(而且实现可以访问magic,因此如果它真的想避免它们,就不需要任何技巧)@R.MartinhoFernandes:我喜欢您的博客,但只适合那些不想涉入其中的读者,您指出,在C++11中,函数模板可以有一个默认的模板参数,这是一个很好的应用
    enable\u if
    @R.MartinhoFernandes:这很有趣。不幸的是,MSVC++(我想支持它)还不支持它。给我
    错误C4519:默认模板参数只允许在类模板上使用(
    ):(关于推导的观点很好,但请注意,在问题的特定示例中,还有另一个参数具有相同的类型,因此在这种特殊情况下,它实际上可以推导出来。@R.MartinhoFernandes:谢谢,我添加了“一般情况下”:-)我没想到一个关于婴儿名字的网站会包含关于C++11的内容。呵呵,对不起。它只是在我读了关于这本书后用谷歌搜索“GNA”后,在剪贴板上徘徊。谢谢啊,对。“双冒号墙”+1.
        template< class Type >
        void foo( typename Something< Type >::T )