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')... >();
}