如何使用 C++ 20 要求/概念限制折叠表达式?

Gon*_*n I 23 c++ variadic-templates c++-concepts fold-expression c++20

如何使用 C++20 概念限制可变参数模板和折叠表达式中允许的类型?

例如,假设我想限制以下折叠表达式仅支持整数类型,我该怎么做?

#include <string>
#include <iostream>
#include <concepts>
using namespace std;

template<typename... Args> // requires (is_integral<Args>::value )
    int sum(Args... args) { return (... + args); }
int main()
{
    cout << sum(1,2,3);
}
Run Code Online (Sandbox Code Playgroud)

Hol*_*Cat 31

使其工作的最小改变是:

requires (std::is_integral<Args>::value && ...)
Run Code Online (Sandbox Code Playgroud)

我还建议使用不太冗长的内容is_integral_v<...>而不是is_integral<...>::value.

或者,更好的是,有一个概念:

template <std::integral ...Args> // no requires needed
Run Code Online (Sandbox Code Playgroud)


康桓瑋*_*康桓瑋 24

您可以使用类型约束 auto语法:

int sum(std::integral auto... args) { return (... + args); }
Run Code Online (Sandbox Code Playgroud)