概念可以与CRTP习惯用法一起使用吗?

问题描述 投票:1回答:1

给出以下奇怪的重复模板模式(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();

我开始怀疑是否可以通过使用概念来限制可能的基类集。我基于this answer的想法假设使用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上进行了测试。)

c++ c++20 crtp c++-concepts
1个回答
0
投票

我已经阅读了一个提议,该提议提议定义对类定义的约束。但是它没有合并到标准中。因此,如果您想限制一个类的定义,我知道的唯一解决方法是在定义该类的上下文中使用一个静态断言,即在函数体内:

© www.soinside.com 2019 - 2024. All rights reserved.