【问题标题】:How to call a function of a related (but different) C++ concept? [duplicate]如何调用相关(但不同)C++ 概念的函数? [复制]
【发布时间】:2020-05-09 05:26:34
【问题描述】:

我有一个概念concept_a 和第二个概念concept_ab 有更多要求,例如

    template<typename T> concept concept_a = ...;

    template<typename T> concept concept_b = ...;

    template<typename T> concept concept_ab = concept_a<T> && concept_b<T>;

现在我有一些函数f 用于这些概念。在更严格概念的函数中,我想为不太严格的概念重用该函数:

    int f(concept_a auto a) {return 1;}
    int f(concept_ab auto ab)
    {
       int n =f<concept_a> (ab);
       return n+10;
    }

但是,这不起作用,因为f&lt;concept_a&gt; 在语法上无效。当然,我可以通过添加另一个间接级别来解决这个问题,(即添加一个函数f_concept_a,它被f 调用)。我的问题是:是否有直接的方法来调用不同(但相关)概念的函数?

【问题讨论】:

  • 是的,这是一个类似的问题,具有相同的简短答案(没有直接的方法),但答案很长(可能的替代解决方案)

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


【解决方案1】:

模板的结果基于用于实例化它的模板参数。约束不是模板参数,只有类型、值(非常有限的种类)和其他模板可以是模板参数。对于给定的somethingf&lt;something&gt; 将始终引用相同的模板实例化。您正在使用模板参数推导和函数重载,但总体效果是相同的:您不能让 f(ab) 调用除模板实例化之外的任何内容。

处理这个问题的正确方法是使用一些f_name 函数来完成你的第一个f 函数所做的事情。你可以重写你的第一个 f 函数来调用它。

【讨论】:

  • 是的,我知道可以使用f_concept_a(或您命名的f_name)解决问题。根据情况可能会有其他解决方案,例如如果ab 可以转换为一些 concept_Af(static_cast&lt;A&gt;(ab)) 将起作用。问题只是 C++ 语言中是否已经有内置解决方案,或者我是否必须自己编写解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多