C++20中模板class的概念

Concept of template class in C++20

我不熟悉模板和概念的高级用法,所以这里有一个有点复杂的问题:

(其实所有的概念都有额外的要求,这里无所谓)


所以问题在最后一个Objects_handlers概念中:

template<template <concepts::Traits _Traits> class _Objects_handlers, typename _Object>
concept Objects_handlers = requires(const _Object& obj)
{
  // has handle_object method
  { _Objects_handlers<???????>::handle_object(obj) } -> std::same_as<std::string>;
                      ^^^^^^^
};

我无法检查没有模板参数的 _Objects_handlers 方法(很明显),而且我无法正确设置必须是 Traits.

之一的模板参数

我该怎么做?

实际上Objects_handlersdatabaseclass模板中的使用可能有问题,所以还有一个问题:如何使用它?


P.S。它可能是 XY 问题,也可能根本不是关于概念的问题...也许与策略模式组合会更有用,但仍然想尝试创建这个可能无用但可行的概念。

让我们大大减少这个问题。

template <typename T>
struct C {
    void f();
};

现在,您的目标是编写一个采用任何 class 模板(例如 C)的概念,并检查 它的每个特化 是否具有名为 f.

的空成员函数
template <template <typename> class Z>
concept HasF = requires (Z<???> z) {
    z.f();
};

问题是 - class C++ 中的模板不能像这样工作。即使对于特定的 class 模板,例如 C,您也不能要求 每个 专业化都有 f。没有办法确保像某人一样,在某处,没有添加:

template <> struct C<std::vector<std::list<std::deque<int>>>> { };

您所能做的就是检查 特定的 类型是否具有名为 f 的空成员函数。那就是:

template <typename T>
concept HasF = requires (T t) { t.f(); };

类型约束语法 template <Concept T> 仅适用于约束类型的概念,不适用于约束模板或值的概念。