gpt4 book ai didi

c++ - 带约束的可变参数模板的 'requires' 表达式的语法是什么?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:21:36 25 4
gpt4 key购买 nike

如果我有一个可变参数模板;

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

};

然后模板的定义及其约束按预期工作。

但是如果我“要求”对 Foo 有更多限制,那么使用“要求”表达式格式,例如;

  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

关于c++ - 带约束的可变参数模板的 'requires' 表达式的语法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57310230/

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