gpt4 book ai didi

c++ - 其参数作为模板非类型传递的可变参数函数模板

转载 作者:行者123 更新时间:2023-11-30 01:03:01 24 4
gpt4 key购买 nike

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

  • 不接受普通的函数参数,而是
  • 采用非类型模板参数,

喜欢f<200, 50, 6>() == 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;
}

这个丑陋的代码有效,而且很有趣,因为它顺便教会了我 sizeof...() .不过,这不可能是对的,对吗?

每次我尝试更简单的东西时,编译器都会犹豫,提示名称查找冲突或模板重新定义或其他类似的东西。

我的概念感觉不对。我怀疑我错过了重点。请问我错过了什么要点?

引用

有关信息,在标准(草案 here )中,引起我疑问的部分是 sect. 5.13.8(第 3 和 4 段)。然而,据我所知,挑衅是偶然的。我的问题不是关于标准本身。我的问题是关于可变参数的正确、优雅的使用。

非编译示例

如果你想要一个我更优雅的非编译代码的例子,这里有一个:

namespace {
template<> constexpr int f() {return 0;}
template<int A, int... C> constexpr int f() {
return A + f<C...>();
}
}

阅读编译器的错误信息后,我明白了为什么这段代码会失败,所以这不是我的问题。相反,我的问题是

  • 如何像f<200, 50, 6>()这样的可变参数调用应该适本地实现并且
  • 我因此缺少关于 C++ 可变参数的什么概念。

最佳答案

C++17写函数的方式是

template<auto... Vals>
constexpr auto sum() noexcept(noexcept((Vals + ...)))
{
return (Vals + ...);
}

在哪里template<auto... Vals>说我们有一个可变的值模板和(Vals + ...)fold expression它将所有值加在一起(需要外部 () 才能形成有效的折叠表达式)。

我用了auto...所以它不限于特定类型。可以添加 SFINAE 以将模板限制为仅支持加法的类型(如果需要的话),否则如果参数包中的所有类型都不能加在一起,您只会收到编译器错误。

关于c++ - 其参数作为模板非类型传递的可变参数函数模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55053299/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com