【问题标题】:c++20 concept check for function being declared constc++20 对声明为 const 的函数的概念检查
【发布时间】:2021-04-11 11:30:45
【问题描述】:

我想测试 c++20 中的新概念功能,我想知道是否可以创建一个概念来检查声明为 const 的函数是否存在。
如果函数以正确的类型存在但不是 const,我希望检查失败。我在这里找不到任何相关内容:https://en.cppreference.com/w/cpp/concepts

我有这个

template <typename T>
concept hasToString = requires (T val) {
    { val.toString() } /* const here gives error */ -> std::same_as<std::string>;
};

void f(hasToString auto bar)
{
    std::cout << bar.toString();
}

【问题讨论】:

    标签: c++ constraints c++20 c++-concepts


    【解决方案1】:

    可以将参数设为const:

    template <typename T>
    concept hasToString = requires (T const val) {
        { val.toString() } -> std::same_as<std::string>;
    };
    

    概念检查使用模式,因此如果您要检查的是在 const 对象上调用成员函数,则需要构造该场景。


    请注意,如果T 恰好是引用类型,这取决于您希望发生什么。如果你想让它工作:

    void f(hasToString auto&& bar)
    

    那么T可能是一个引用类型,如果你仍然希望它真的是const,那么你需要把T&amp;这样的类型变成T const。长篇大论是:

    template <typename T>
    concept hasToString = requires (std::remove_reference_t<T> const val) {
        { val.toString() } -> std::same_as<std::string>;
    };
    

    但如果你这样做的次数足够多,你可以考虑添加一个别名模板来处理它。

    【讨论】:

      【解决方案2】:

      当应用于 const 对象参数时,您始终可以检查表达式是否格式正确。

      template <typename T>
      concept hasToString = requires (T val) {
          { std::as_const(val).toString() } -> std::same_as<std::string>;
      };
      

      template <typename T>
      concept hasToString = requires (T val, T const cval) {
          { cval.toString() } -> std::same_as<std::string>;
      };
      

      添加一个额外的对象参数可能更符合抽象概念需求的定义方式(好吧,如果您的 requires-expression 检查多个需求)。您可以在 require-expression 的参数列表中拥有任意数量的参数。

      【讨论】:

      • 您可能想指出如果T 是引用类型会发生什么。第一个版本将const 放在它下面。第二个忽略const
      • @HTNW - Barry 有一个非常好的答案。除了少数例外,答案的多样性是 SO 的优势。
      猜你喜欢
      • 2021-07-30
      • 2022-09-29
      • 2021-03-15
      • 1970-01-01
      • 2021-07-12
      • 2020-02-25
      • 2021-12-15
      • 2021-10-06
      • 1970-01-01
      相关资源
      最近更新 更多