繁体   English   中英

C++20中模板class的概念

[英]Concept of template class in C++20

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

  • 我对每个Source类都有许多特征的Traits概念:

     template<typename _Traits> concept Traits = requires { std::same_as<std::decay_t<decltype(_Traits::token)>, std::string_view>; };
  • 我有一些模板 class,它使用这个概念来处理具有各种特征的object_one (例如,一半的Source类返回object_one ):

     template <concepts::Traits _Traits> class Object_one_handler final { static std::string handle_object(const object_one& obj) {/*...*/} };
  • 然后我有Objects_handlers处理程序的概念,这些对象来自各种Sources的集合{object_one, object_two, object_three}及其Traits

     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>; };
  • 最后,我创建了一些指定为模板参数Object_handlerdatabase

     template<concepts::Objects_handlers _handler> class database {...};

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


所以问题出在最后的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之一的模板参数。

我怎样才能做到这一点?

而实际上可能是database Objects_handlers模板中Objects_handlers的使用有问题,所以又多了一个问题:如何使用?


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

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

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

现在,您的目标是编写一个采用任何 class 模板(例如C )的概念,并检查它的每个特化都有一个名为f的无效成员 function 。

template <template <typename> class Z>
concept HasF = requires (Z<???> z) {
    z.f();
};

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM