Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.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
Templates 对可变模板中的每个参数进行加法/减法运算,并转发结果_Templates_Expression_C++14_C++17_Variadic - Fatal编程技术网

Templates 对可变模板中的每个参数进行加法/减法运算,并转发结果

Templates 对可变模板中的每个参数进行加法/减法运算,并转发结果,templates,expression,c++14,c++17,variadic,Templates,Expression,C++14,C++17,Variadic,假设我有一个函数,它取整数的可变模板: template < int... I > int dummy() { // to each int in I add/subtract something // and forward the pack with modified values somewhere else // test< (I -/+ n)... > } 这不是我需要的场景,而是一个例子来说明我的意思 我在寻找tinto C++17折

假设我有一个函数,它取整数的可变模板:

template < int... I > int dummy()
{
    // to each int in I add/subtract something
    // and forward the pack with modified values somewhere else
    // test< (I -/+ n)... >
}
这不是我需要的场景,而是一个例子来说明我的意思

我在寻找tinto C++17折叠表达式,但据我所知,它并没有生成修改后的参数包,而是将它们折叠为单个值

用适当的编译时间实现这一目标的有效方法是什么

编辑

举个例子,我会用这个。我想要一个可变的用户定义文字,如:

template < char... I > int operator"" _test()
{
    //...
}
但接收到的参数是ASCII小数,而不是实际数字


因此,我希望能够有类似于
(I-“0”)…
的东西,它能给出实际的数字。

似乎我一直都有答案

template < char C > int test()
{
    printf("%d_", C);
    return C;
}
template < char C1, char C2, char... Cs > int test()
{
    printf("%d_", C1);
    return C1 + test<C2, Cs...>();
}

template < char... I > int operator"" _show()
{
    return test< (I - '0')... >();
}
templateint test()
{
printf(“%d”,C);
返回C;
}
模板<字符C1,字符C2,字符。。。Cs>int测试()
{
printf(“%d”,C1);
返回C1+测试();
}
模板<字符。。。I>int运算符“”\u show()
{
回归测试<(I-‘0’…>();
}

看来我一直都有答案

template < char C > int test()
{
    printf("%d_", C);
    return C;
}
template < char C1, char C2, char... Cs > int test()
{
    printf("%d_", C1);
    return C1 + test<C2, Cs...>();
}

template < char... I > int operator"" _show()
{
    return test< (I - '0')... >();
}
templateint test()
{
printf(“%d”,C);
返回C;
}
模板<字符C1,字符C2,字符。。。Cs>int测试()
{
printf(“%d”,C1);
返回C1+测试();
}
模板<字符。。。I>int运算符“”\u show()
{
回归测试<(I-‘0’…>();
}

我不确定您是否要使用用户定义的文本,因为这样您就限制了它可以接受的输入类型。相反,您可以定义一个执行该操作的自由浮动函数,并将其传递给
测试

struct测试
{
静态无效应用()
{

std::cout我不确定您是否要使用用户定义的文本,因为这样您就限制了它可以接受的输入类型。相反,您可以定义一个自由浮动函数来执行该操作,并将其传递给
test

struct测试
{
静态无效应用()
{

std::难道我不知道你的问题是什么吗。用户定义的文本(包含ASCII字符的参数包)必须转换ASCII字符“2”(十进制50)之类的内容因此,我想知道如何从每个接收到的字符中减去ASCII字符“0”,并将结果参数包转发到其他地方。这样的用例是为SIMD内部函数形成洗牌掩码。在这里,我可以替换宏
\u MM\u shuffle(1,2,3,4)
使用作用域为constepr的用户定义文字
1234\u ShM
。之后甚至使用字母
xyz\u ShLM
。这会让问题更清楚吗?我不知道你的问题是什么。使用ASCII字符参数包的用户定义文字必须转换类似ASCII字符“2”(十进制50)的内容因此,我想知道如何从每个接收到的字符中减去ASCII字符“0”,并将结果参数包转发到其他地方。这样的用例是为SIMD内部函数形成洗牌掩码。在这里,我可以替换宏
\u MM\u shuffle(1,2,3,4)
使用范围限定的constepr用户定义的文字
1234\u ShM
。之后甚至使用字母
xyz\u ShLM
。这会让问题更清楚吗?如果我想得到
'1'
的十进制值,那么我会调用
49\u show;
,对吧。但是,这将分别取
4
9
,即n看我的答案。你可以看到,虽然
test
接收整数,但它并没有将我们的ASCII值49(
a
)转换为
1
(十进制),而不是
4
9
。因此,您必须首先提供整数,这有点违背了转换的目的…这是实际的目标。分别获取每个字符,然后减去“0”,这将给出实际的索引。然而,在发布此问题后不久,我意识到这不是一个非常简单的问题灵活的方法,它需要移动验证而不是必要的。这就是我试图实现的目标:我最初将SIMD排除在问题之外的原因是因为我试图避免让它看起来像一个SIMD问题,而是一个模板操作问题。很抱歉造成混淆。您在GitHub上显示的代码有问题-格式:
templateconstexpr int operator”“\u Shuffle()
。如果提供模板文本,它必须有一个空的参数列表,并且只能有一个模板参数,该参数必须是元素类型为
char
的非类型模板参数包。此外,还可以使用类似于
“Yy1y”的用法_Shuffle
是一个应该寻找一个外观截然不同的函数的函数。要么是编译器错误,要么是格式错误,不需要诊断。它不是可移植代码。显然,这是一个GCC扩展(也由clang支持)。而且只在C++14上使用。出于我的需要,它工作得很好。感谢您提供的信息。令人惊讶的是,在MinGW上,它与C++11一起工作。如果我想获得
'1'
的十进制值,那么我会调用
49;
,对。但是,这将分别需要
4
9
,这不是您想要的。请参阅我的答案。。您可以看到,虽然
test
确实接收整数,但它并没有将ASCII值49(
a
)转换为
1
(十进制),而不是
4
9
。因此,您必须首先提供整数,这有点违背了转换的目的…这是实际的目标。分别获取每个字符,然后减去“0”,这将给出实际的索引。然而,在发布此问题后不久,我意识到这不是一个非常简单的问题灵活的方法,它需要比必要的移动验证
template < char... I > int operator"" _test()
{
    //...
}
18264_test;
template < char C > int test()
{
    printf("%d_", C);
    return C;
}
template < char C1, char C2, char... Cs > int test()
{
    printf("%d_", C1);
    return C1 + test<C2, Cs...>();
}

template < char... I > int operator"" _show()
{
    return test< (I - '0')... >();
}