能够采用第三方依赖项的最佳扩展机制?

问题描述

我目前正试图让我的脚接触概念。让我们假设我有一个概念:

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 (将#修改为@)