Kul*_*ulo 0 c++ c++-concepts c++20
我正在尝试 C++20 功能,并且我想用来concept限制模板仅传递具有名为 的成员List且其类型应该为 的类std::vector<int>。这是前言。
要在不使用 的情况下执行此操作concept,我将编写以下代码:
class RandomClass
{
public:
std::vector<int> List;
};
typename std::enable_if<std::is_same<decltype(T::List), std::vector<int>>::value>::type
func(T& arg)
{
...
}
int main()
{
auto randomObj= RandomClass();
func(randomObj);
}
Run Code Online (Sandbox Code Playgroud)
我要求 New Bing 使用concept重写它,它给出了以下内容:
template<class T>
concept HasList = requires(T t) {
{ t.List } -> std::same_as<std::vector<int>>;
};
template<class T> requires HasList<T>
void func(T& arg)
Run Code Online (Sandbox Code Playgroud)
但是这段代码无法编译,编译器给出了'func': no matching overloaded function found.
然后我搜索std::same_as用法并尝试了这个:
template<class T>
concept HasList = requires(T t) {
std::same_as<AddressListType, decltype(T::List)>;
};
Run Code Online (Sandbox Code Playgroud)
这段代码有效。
现在问题如下:
{ t.List } -> std::same_as<std::vector<int>>;意思?我不知道这{}是->从哪里来的{ t.List } -> std::same_as<std::vector<int>>;不能工作?您的概念只有一个小问题:成员变量被视为对向量的引用。使用该概念的以下版本应该可行:
template<class T>
concept HasList = requires(T t) {
{ t.List } -> std::same_as<std::vector<int>&>;
};
Run Code Online (Sandbox Code Playgroud)
请注意,当成员变量类型是对非常量的引用或List是静态成员的情况时,也满足此概念。如果您对这些情况感到困扰,您可能需要修改支票。
template<class T>
concept HasList = requires
{
{ &T::List } -> std::same_as<std::vector<int> T::*>; // check, if the T::List is a pointer to a non-static member variable of type std::vector<int>
};
Run Code Online (Sandbox Code Playgroud)
在:
{ t.List } -> std::same_as<std::vector<int>>;
Run Code Online (Sandbox Code Playgroud)
t.List是一个表达式,也是std::same_as<std::vector<int>>一个必须满足的概念。具体来说:
std::same_as<X, std::vector<int>>
Run Code Online (Sandbox Code Playgroud)
必须满足作为X表达式的类型t.List。