【问题标题】:multiple template parameters in concept definition概念定义中的多个模板参数
【发布时间】:2019-02-08 13:18:18
【问题描述】:

我有一个包含多个模板参数的概念

template<typename T, typename U> EqualityComparable

我可以用这个吗

template< EqualityComparable T /* and U */ > void foo() {}

不知何故?

作为一个例子,考虑这个 sn-p

template <typename T, typename U>
concept EqualityComparable = requires(T a, U b) {
        {a == b} -> bool;
        {a != b} -> bool;
};

template<EqualityComparable T /* and U */>
void foo (T,U) {} //can i make this work?

int main () {
    foo(1.0f,1);
}

godbolt 上的 clang 实验概念编译器告诉我

template<EqualityComparable T /* and U */> void foo(T,U) {}

--> error: concept 'EqualityComparable' requires more than 1 template argument; provide the remaining arguments explicitly to use it here

所以这似乎表明这是可能的?

【问题讨论】:

    标签: c++ c++-concepts


    【解决方案1】:

    这是可能的

    template<typename A, typename B> requires EqualityComparable<T,U>
    void foo_works(T,U) {}
    

    但我想知道它是否直接在template&lt;&gt; 中工作

    【讨论】:

    • 我只略读了一些概念,但我认为这是唯一的方法。
    • Herb Sutter 提出的模板参数诱导器可以解决这个问题,但在合并到语言中之前需要更多的迭代
    【解决方案2】:

    我认为这应该可行:

    template<class T>
    void foo_works(T, EqualityComparable<T> auto);
    

    或等效:

    template<class T, EqualityComparable<T> U>
    void foo_works(T,U);
    

    它会产生预期的效果,但正如它所写的那样,它并不反映 EqualityComparable 概念的对称性。

    因此,一些编码人员可能更喜欢对对称约束使用非缩写语法:

    template<class T,class U>
       requires EqualityComparable<T,U>
    void foo_works(T,U);
    

    有了 TS 的概念,就有这种可能性:

    EqualityComparable{T,U}
    void foo_works(T,U);
    

    但这种语法吓坏了保守派。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多