问题描述
我目前正试图让我的脚接触概念。让我们假设我有一个概念:
template <class T> concept Initable = requires (T&t) { { init(t) }; };
// just for demonstration purposes,real concept makes more sense ...
并且我想为像 std::optional
这样的第三方类提供一个采用层来实现这个概念,对我来说最简单的方法是什么?
显然,下面这段代码失败了:
template <std::semiregular T>
T& init(std::optional<T> &v) { /* contents not that important */ v = T{}; return *v; }
static_assert(Initable<std::optional<int>>,"Oh no!"); // Fails!
原因是两阶段查找。
在第 1 阶段尝试解析 init
概念中的 Initable
时,我对 init
的定义不可用,因为它在下面提供{1}} 概念。
在第 2 阶段尝试解决它时,通过依赖参数的查找找不到我的定义,因为 Initable
命名空间中没有提供它。
因此,两个明显的解决方案是在定义 std
概念之前提供 init
的定义或将 Initable
移至 init
命名空间。
但我想在没有
的情况下为std
实现这个概念
- 依赖于特定的定义/包含顺序,
- 填充
std::optional
命名空间和 - 在调用方站点使用太多样板代码。
这样做的最佳方法是什么?在定义 std
概念时,我是否可以更轻松地完成此操作?
基本上我是问,this 可能吗?
Initable
如果没有,下一个最好的事情是什么?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)