【发布时间】:2021-01-16 17:39:12
【问题描述】:
给定一个这样的类模板:
template<typename T>
struct foo
{
T data;
};
如何使用 C++20 概念确定 T 是否为智能指针,例如 std::shared_ptr<T_underlying>?
我想根据此标准向foo<T> 添加功能。例如,我不想使用 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<T>? -
您已经在示例中包含了代码的概念部分。剩下的就是编写
is_shared_ptr_v特征,您可以按照自 c++11 以来的相同方式进行操作。 -
T的哪些语义与您相关?确定这一点,然后尽可能多地对其进行测试,最后转换为concept。
标签: c++ c++20 c++-concepts