【问题标题】:Concept for smart pointers智能指针的概念
【发布时间】:2021-01-16 17:39:12
【问题描述】:

给定一个这样的类模板:

template<typename T>
struct foo
{
    T data;
};

如何使用 C++20 概念确定 T 是否为智能指针,例如 std::shared_ptr&lt;T_underlying&gt;?

我想根据此标准向foo&lt;T&gt; 添加功能。例如,我不想使用 SFINAE,而是使用新概念系统。

我想实现这样的目标:

template<typename T>
struct foo
{
    T data;

    void func()
    requires is_shared_ptr_v<T>
    {
        // ...
    }
};

STL 中是否有这方面的现有概念?如果不是,我假设我可以为std::shared_ptr 写一个概念,为std::unique_ptr 写一个概念等等,然后将它们与逻辑或一般is_smart_pointer 概念联系在一起?

【问题讨论】:

  • 想一想如何用 SFINAE 做到这一点,并简单地将其直接转化为一个概念。使用 SFINAE,您只需专门化并验证类型是 shared_ptr 和 unique_ptr 的实例。你只是对一个概念做同样的事情,那么你不清楚其中的哪一部分?
  • 如何定义智能指针以区别于T* 和optional&lt;T&gt;?
  • 您已经在示例中包含了代码的概念部分。剩下的就是编写 is_shared_ptr_v 特征,您可以按照自 c++11 以来的相同方式进行操作。
  • T 的哪些语义与您相关?确定这一点,然后尽可能多地对其进行测试,最后转换为concept。

标签: c++ c++20 c++-concepts


【解决方案1】:

您可能首先创建一个特征来检测类型是否为std::shared_ptr(方式取决于您是否要考虑继承)。

然后使用特征来构建一个概念:

template <typename T> struct is_shared_ptr : std::false_type {};
template <typename T> struct is_shared_ptr<std::shared_ptr<T>> : std::true_type {};

template <typename T> concept IsSharedPtr = is_shared_ptr<T>::value;

或

template <typename T>
std::true_type inherit_from_shared_ptr_impl(const std::shared_ptr<T>*);
std::false_type inherit_from_shared_ptr_impl(...);

template <typename T>
using inherit_from_shared_ptr =
    decltype(inherit_from_shared_ptr_impl(std::declval<T*>()));

template <typename T> concept InheritFromSharedPtr = inherit_from_shared_ptr<T>::value;

【讨论】:

    【解决方案2】:

    写“像指针一样”。具有一元解引用,显式转换为 bool,并且是指针或具有运算符箭头。也许(对于非指针)get 返回与操作符箭头相同的类型。

    然后声明智能指针是一个指针,就像不是指针的东西。

    请注意,某些迭代器在此规则下是智能指针。

    如果你想要一个“拥有”指针,你必须有一个手动特征;除了语义之外,没有其他方法可以说明这一点。

    【讨论】:

      猜你喜欢
      • 2020-06-03
      • 2014-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-16
      • 1970-01-01
      相关资源
      最近更新 更多