概念可以与 CRTP 习语一起使用吗?
Can concepts be used with CRTP idiom?
给出了以下奇怪的重复出现的模板模式(CRTP(代码示例:
template<typename X>
struct Base {
X f() const { return X{}; }
};
template<template<typename> typename T>
struct Derived : T<Derived<T>>
{};
const Derived<Base> d0{};
const Derived<Base> d1 = d0.f();
我开始怀疑是否有可能通过使用概念来限制可能的基类集。基于这个答案,我的想法假设使用requires B<T, Derived<T>>
,其中B
定义如下:
#include <concepts>
// ...
template<template<typename> typename T, typename X>
concept B = requires (T<X> t)
{
{ t.f() } -> std::convertible_to<X>;
};
显然,我不能使用这种形式:
template<template<typename> typename T> requires B<T, Derived<T>>
struct Derived : T<Derived<T>>
{};
因为尚未定义要求子句中的Derived
。这:
template<template<typename> typename T>
struct Derived requires B<T, Derived<T>> : T<Derived<T>>
{};
而这个:
template<template<typename> typename T>
struct Derived : T<Derived<T>> requires B<T, Derived<T>>
{};
也不要解决问题。
有没有办法克服这些困难并将概念与CRTP结合起来?
(我在GCC 10.0.1上进行了测试。
我读过一个提议对类定义约束的提案。但它没有合并到标准中。因此,如果你想约束类定义,我知道的唯一解决方法是在完全定义类的上下文中使用静态断言,所以在成员函数体内:
template <class Base>
struct A: Base
{
A() {
static_assert(a_concept <A>);
}
};
相关文章:
- 概念可以与 CRTP 习语一起使用吗?
- 复制和交换习语和迭代器
- 为什么当我做复制和交换习语时不调用我的复制构造函数?
- 漂亮的计数器习语的错误或格式错误的静态订单惨败?
- C++17 pimpl 习语上下文中的自定义迭代器
- 在 MyVector 中实现写入时复制习语
- 视觉 "extern __forceinline "是什么 c++ 习语?
- C 习语使用C库时,该C库期望功能指针
- 为什么 std::swap 不使用 swap 习语?
- 如何使用擦除删除习语从结构向量中删除值
- C++中的Singleton习语
- 在 C++11 中实现复制和交换习语的更好方法
- N 个并发读取器和 1 个生产者的习语或模式
- pImpl习语-将私有类实现放在cpp中有什么缺点
- 不能使用 pimpl 习语将用户定义的向量插入到封装的向量中
- Python -> C++ 习语:将 lambda 表达式存储在映射/容器中
- 安全方便的通用散列(用于 STL 无序集和映射)习语?
- 指向可配置实现的Pimpl习语
- 与构造函数参数相关的异常安全的习语
- 如何将pimpl习语与Qt和QObject的子类一起使用