c++ - 在类声明中使用概念

结构 Vec 具有成为 std::default_initializable 的所有要求。但是声明还没有结束,所以编译失败。

template <std::default_initializable A>
struct It {};

struct Vec { 
    using Iterator = It<Vec>;
};

是否有某种解决方法来保持 It 要求?

最佳答案

一般来说,您的问题的答案是否定的。如果你想创建一个成员类型别名,它必须在相关时间是已知的。如果您尝试实例化的模板要求给定的类型是完整的(default-initializable 就是这样),那么它必须是完整的。

然而,在您的特定情况下,并不是真的有必要制作 Iterator成员。如果你想要范围的迭代器类型,正确的方法是使用 ranges::iterator_t .和 that meta-function将返回 ranges::begin() 的类型返回。

你的 begin可以指定成员函数返回auto , 这样函数的定义就是提供 It<Vec> 的, as follows :

template <std::default_initializable A>
struct It {};

struct Vec
{ 
    auto begin() {return It<Vec>(...);}
};

话虽如此,即使您想在它所服务的容器/范围之外定义迭代器类型,它仍然绑定(bind)到该容器/范围类型。除非It是某种 View 或范围转换(如果是,它可能不应该默认构建它修改的范围),It<UserType>不应该工作。因此,约束 It模板毫无意义;你知道 Vec是默认可构造的,因为您将该类写在迭代器的正下方。如果你想要一个完整性检查,你可以使用 static_assert , 但您不需要约束模板本身。

https://stackoverflow.com/questions/66987676/

相关文章:

azure - Get-AzRoleAssignment 在 Azure Runbook 中引发 M

gradle - 为一项任务禁用远程 Gradle 缓存

angular - 如何在 Angular 中将 patchValue 与 FormArray 一起

python - datetime.combine with timezone 不同于 dateti

telegram-bot - 用于从机器人类发送的消息的 CallbackQueryHandler

c# - 尽管有效的正则表达式和激活的解析在 gitlab 中没有覆盖率报告

java - 未找到 native micronaut 数据插入查询的可能实现

javascript - Css 过渡不适用于 React 中的条件渲染

python - 如何使 Prophet 的输出静音?

reactjs - 如何在嵌入式 React App 中的页面之间路由?