相关疑难解决方法(0)

如何在 C++20“requires”表达式中使用未指定的类型?

我正在尝试编写一个 C++20 概念来表达类型具有某种方法(该方法接受参数)的要求,但出于此概念的目的,我不关心参数类型是什么。

我试着写一些类似的东西:

template <typename T>
concept HasFooMethod = requires(T t, auto x)
{
    { t.Foo(x) } -> std::same_as<void>;
};
Run Code Online (Sandbox Code Playgroud)

然而,gcc 和 clang 都拒绝这一点,并给出一个错误,即“auto”不能以这种方式在 require 表达式的参数列表中使用。

另一种方法是将“x”的类型作为第二个模板参数:

template <typename T, typename TX>
concept HasFooMethod = requires(T t, TX x)
{
    { t.Foo(x) } -> std::same_as<void>;
};
Run Code Online (Sandbox Code Playgroud)

但这需要在使用该概念时明确指定 TX,因此无法推断:

struct S { void Foo(int); };
static_assert(HasFooMethod<S>);         // doesn't compile
static_assert(HasFooMethod<S, int>);    // the 'int' must be specified
Run Code Online (Sandbox Code Playgroud)

有没有办法编写一个允许 Foo 接受未指定类型的参数的概念?

需要约束模板成员函数的概念定义问题非常相似,但不相同:该问题询问如何要求(模板化)方法可以采用满足给定概念的任何类型,而这个问题是关于要求方法采用某种特定类型,尽管该类型未指定。就量词而言,另一个问题是关于(有界)普遍量化,而这个问题是关于存在量化。另一个问题的答案也不适用于我的情况。

c++ c++-concepts c++20

3
推荐指数
1
解决办法
1313
查看次数

标签 统计

c++ ×1

c++-concepts ×1

c++20 ×1