gpt4 book ai didi

c++ - 不受约束的 requires-expression 参数

转载 作者:行者123 更新时间:2023-12-04 03:35:36 26 4
gpt4 key购买 nike

我能否在概念的 C++20 约束中使用受约束的泛型类型?例如,假设我想写一个要求,候选类 T 有一个函数 func,它可以接受满足 std 的任何类型的参数::范围::范围:

template<typename T>
concept Foo = requires (T t, std::ranges:range s) {
{ t.func(a); } -> std::convertible_to<double>;
}

但是 GCC 给我一条错误消息,指出不能在我放置 std::ranges::range 的地方使用占位符类型。

最佳答案

在我看来,您正在寻找一个带有(仅声明的)operator T () 的结构,用于通用 T

struct generic_argument
{
template <typename T>
operator T () const;
};

因此您可以为每个预期参数和模板参数传递它(在 decltype() 中)。

所以你的概念(抱歉......我简化了它删除了范围参数)变成了(如果我明白你想要什么)

template<typename T>
concept Foo
= std::convertible_to<decltype(std::declval<T>().func(std::declval<generic_argument>())),
double>;

下面是一个完整的编译示例

#include <iostream>

struct A { double func (int a) { return a; } };
struct B { double not_func (long a) { return a; } };
struct C { std::string func (char) { return "abc"; } };
struct D { float func (auto) { return 1.0f; } };

struct E { double func (int a) { return a; }
std::string func (char) { return "abc"; } };

struct generic_argument
{
template <typename T>
operator T () const;
};

template<typename T>
concept Foo
= std::convertible_to<decltype(std::declval<T>().func(std::declval<generic_argument>())),
double>;

template <Foo T>
void bar (T const &)
{ std::cout << "bar, Foo version\n"; }

template <typename T>
void bar (T const &)
{ std::cout << "bar, generic version\n"; }

int main()
{
bar(A{}); // print bar, Foo version
bar(B{}); // print bar, generic version [no func() function]
bar(C{}); // print bar, generic version [no convertible to double]
bar(D{}); // print bar, Foo version
bar(E{}); // print bar, generic version [two func() function]
}

我对 E 的情况有疑问:两个 func() 方法,一个只返回一个可转换为 double 的类型,来自bar(E{}) 我们得到“bar, generic version”。

关于c++ - 不受约束的 requires-expression 参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66994909/

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