Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/apache-flex/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++_Variadic Templates - Fatal编程技术网

C++ 变量函数模板,其参数作为模板非类型传递

C++ 变量函数模板,其参数作为模板非类型传递,c++,variadic-templates,C++,Variadic Templates,C++17标准提到了一个特殊的变量函数模板 不接受普通函数参数,而是, 接受非类型模板参数, 比如f==256 我想,这很奇怪,让我看看我是否能自己编写代码。我的代码很优雅。然而,我优雅的代码无法编译,因此在两个毫无结果的小时后,我编写了这段丑陋的代码: #include <iostream> namespace { template<int A> constexpr int f() {return A;} template<int A, int

C++17标准提到了一个特殊的变量函数模板

不接受普通函数参数,而是, 接受非类型模板参数, 比如f==256

我想,这很奇怪,让我看看我是否能自己编写代码。我的代码很优雅。然而,我优雅的代码无法编译,因此在两个毫无结果的小时后,我编写了这段丑陋的代码:

#include <iostream>

namespace {
    template<int A> constexpr int f() {return A;}
    template<int A, int B, int... C> constexpr int f() {
        if (sizeof...(C)) return A + f<B, C...>();
        else return A + B;
    }
}

int main() {
    int n = f<200, 50, 6>();
    std::cout << n << "\n";
    return 0;
}
在阅读了编译器的错误消息之后,我理解了为什么这段代码会失败,所以这不是我的问题。相反,我的问题是

像f这样的变量调用应该如何正确地实现,以及 因此我对C++变量缺少什么概念。
C++17编写函数的方法是

template<auto... Vals>
constexpr auto sum() noexcept(noexcept((Vals + ...)))
{
    return (Vals + ...);
}
如果模板将所有值相加,则需要外部值来生成有效的折叠表达式


我用汽车。。。这样就不局限于特定的类型。如果需要,可以添加SFINAE以将模板约束为仅支持添加的类型,否则如果不能将参数包中的所有类型都添加在一起,则只会出现编译器错误。

C++17编写函数的方法是

template<auto... Vals>
constexpr auto sum() noexcept(noexcept((Vals + ...)))
{
    return (Vals + ...);
}
如果模板将所有值相加,则需要外部值来生成有效的折叠表达式


我用汽车。。。这样就不局限于特定的类型。如果需要,可以添加SFINAE以将模板约束为仅支持添加的类型,否则如果不能将参数包中的所有类型都添加在一起,则只会出现编译器错误。

不确定此处询问的是什么。如果你理解为什么你的代码不好,以及什么格式良好的代码看起来,你在问什么?@谢尔盖亚,我怀疑我使用的变量,因为C++的制造者意味着它被使用。毕竟,如果我做得对,请告诉我。两票势均力敌,不清楚我在问什么!那太糟糕了。在发布之前,我花了一个多小时研究这个问题,所以这差不多是我能做的最好的了。哦,好吧。不知道这里问了什么。如果你理解为什么你的代码不好,以及什么格式良好的代码看起来,你在问什么?@谢尔盖亚,我怀疑我使用的变量,因为C++的制造者意味着它被使用。毕竟,如果我做得对,请告诉我。两票势均力敌,不清楚我在问什么!那太糟糕了。在发布之前,我花了一个多小时研究这个问题,所以这差不多是我能做的最好的了。噢,我喜欢你的回答。是的,你明白我的问题。你的代码更好。现在我在想,像operator+这样的操作符是否真的需要使用您的技术,或者像fooVals之类的东西。。。这同样有效。既然你给我指出了正确的方向,我将研究它。@thb fooVals。。。应该是食物。。。。在这种情况下,它使它成为一个逗号分隔的列表。在像我这样的折叠表达式中,使用特殊规则使使用的运算符展开包,而不是像你通常会得到的逗号。@SergeyA不是例外;情不自禁myself@thb有很多很好的信息,这些信息对我很有帮助,我只是在SO和博客上读了很多东西。此外,cppcon视频在youtube上也是免费的。他们开了一个很棒的会议,视频内容也很丰富。我喜欢你的回答。是的,你理解我的问题。你的代码更好。现在我在想,像operator+这样的操作符是否真的需要使用您的技术,或者像fooVals之类的东西。。。这同样有效。既然你给我指出了正确的方向,我将研究它。@thb fooVals。。。应该是食物。。。。在这种情况下,它使它成为一个逗号分隔的列表。在像我这样的折叠表达式中,使用特殊规则使使用的运算符展开包,而不是像你通常会得到的逗号。@SergeyA不是例外;情不自禁myself@thb有很多很好的信息,这些信息对我很有帮助,我只是在SO和博客上读了很多东西。此外,cppcon视频在youtube上也是免费的。他们开了一个很棒的会议,视频内容丰富。