【发布时间】: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