带约束的可变参数模板的 'requires' 表达式的语法是什么?
What is the syntax for the 'requires' expression of a variadic template with contraints?
如果我有一个可变参数模板;
template<typename T>
concept Fooable = requires (T t) { t.bar() -> bool; };
struct Foo {
int big_foo;
template<std::Integral T, Fooable ... U>
explicit Foo(T&& i, U&& ... f) noexcept
: big_foo {std::forward<T>(i)}
{
Something::something(std::forward<U>(f)...);
...
}
};
然后模板的定义及其约束按预期工作。
但是如果我'require'对Foo进行更多的约束所以使用'requires'表达式格式,如;
template<typename T, typename ... U>
requires std::Integral<T>
&& Fooable<U> && BillyBobable<U> // WHAT GOES HERE? ELLIPSIS... BUT WHERE?
explicit Foo(T&& i, U&& ... f) noexcept
: big_foo {std::forward<T>(i)}
{
SOMETHING::something(std::forward<U>(f)...);
...
}
然后:我使用什么作为可变参数 U
的语法来在表达式中扩展它?
您可以在此处使用常用的 C++17 折叠表达式语法:
template<typename T, typename ... U>
requires std::Integral<T>
&& ((Fooable_concept<U> && BillyBobable_concept<U>) && ...)
explicit Foo(T&& i, U&& ... f) noexcept
或者,您可以通过引入一个合并两者的新概念来返回到早期的语法:
template <typename T>
concept FooAndBillyBob = Fooable_concept<T> && BillyBobable_concept<T>;
template <std::Integral T, FooAndBillyBob ... U>
explicit Foo(T&& i, U&& ... f) noexcept
注意:请不要命名您的概念*_concept
如果我有一个可变参数模板;
template<typename T>
concept Fooable = requires (T t) { t.bar() -> bool; };
struct Foo {
int big_foo;
template<std::Integral T, Fooable ... U>
explicit Foo(T&& i, U&& ... f) noexcept
: big_foo {std::forward<T>(i)}
{
Something::something(std::forward<U>(f)...);
...
}
};
然后模板的定义及其约束按预期工作。
但是如果我'require'对Foo进行更多的约束所以使用'requires'表达式格式,如;
template<typename T, typename ... U>
requires std::Integral<T>
&& Fooable<U> && BillyBobable<U> // WHAT GOES HERE? ELLIPSIS... BUT WHERE?
explicit Foo(T&& i, U&& ... f) noexcept
: big_foo {std::forward<T>(i)}
{
SOMETHING::something(std::forward<U>(f)...);
...
}
然后:我使用什么作为可变参数 U
的语法来在表达式中扩展它?
您可以在此处使用常用的 C++17 折叠表达式语法:
template<typename T, typename ... U>
requires std::Integral<T>
&& ((Fooable_concept<U> && BillyBobable_concept<U>) && ...)
explicit Foo(T&& i, U&& ... f) noexcept
或者,您可以通过引入一个合并两者的新概念来返回到早期的语法:
template <typename T>
concept FooAndBillyBob = Fooable_concept<T> && BillyBobable_concept<T>;
template <std::Integral T, FooAndBillyBob ... U>
explicit Foo(T&& i, U&& ... f) noexcept
注意:请不要命名您的概念*_concept