【问题标题】:Use C++20 Concept to constrain template parameter使用 C++20 Concept 约束模板参数
【发布时间】:2021-11-18 23:52:23
【问题描述】:

我想使用概念来替换当前使用 SFINAE (enable_if) 的设计。为了简化,我创建了一个更简单的示例,它显示了一个相同的问题:

template<typename T>
concept smallerThanPointer = sizeof(T) < sizeof(void*);

template<typename T>
concept notSmallerThanPointer = !smallerThanPointer<T>;


template<smallerThanPointer T>
class MyClass
{
 public:
    MyClass() { std::cout << "MyClass[smallerThanPointer]\n"; }
};

template<notSmallerThanPointer T>
class MyClass
{
 public:
    MyClass() { std::cout << "MyClass[...]\n"; }
};


int main()
{
    MyClass<int[8]> c1;

    return 0;
}

但是我的编译器 (g++-11) 不会接受这种语法,因为它认为我在重新声明 MyClass。这个例子也是不可能的:

template<typename T>
class MyClass requires smallerThanPointer<T>
{
 public:
    MyClass() { std::cout << "MyClass[smallerThanPointer]\n"; }
};

template<typename T>
class MyClass
{
 public:
    MyClass() { std::cout << "MyClass[...]\n"; }
};

我在网上找到的所有带有概念的示例都只讨论了如何将概念应用于函数参数。那么有没有可能与类有关?

【问题讨论】:

  • requires可以紧跟在模板参数列表之后;仅对于函数,它也可以放在(普通)参数列表之后,因为有时根据参数来表达约束更容易。

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


【解决方案1】:

约束的部分模板特化的正确语法应该是:

template<typename T>
concept smallerThanPointer = sizeof(T) < sizeof(void*);
    
template<class T>
class MyClass
{
public:
    MyClass() { std::cout << "MyClass[...]\n"; }
};
    
template<class T> requires smallerThanPointer<T>
class MyClass<T>
{
public:
    MyClass() { std::cout << "MyClass[smallerThanPointer]\n"; }
};

Demo.

【讨论】:

  • template&lt;smallerThanPointer T&gt; 正如你最初拥有的那样,它也适用于专业化并且更简洁一些。
  • @NathanPierson。是的,但我试图遵循 OP 的风格。
猜你喜欢
  • 2022-09-29
  • 2021-09-04
  • 2021-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多