gpt4 book ai didi

c++ - C++20中模板类的概念

转载 作者:行者123 更新时间:2023-12-02 01:57:15 25 4
gpt4 key购买 nike

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

  • 我有一些Traits每个 Source 的许多特征的概念类(class):

    template<typename _Traits>
    concept Traits = requires
    {
    std::same_as<std::decay_t<decltype(_Traits::token)>, std::string_view>;
    };
  • 我有一些模板类使用这个概念来处理 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集合中各种对象的处理程序的概念{object_one, object_two, object_three}来自各种Sources与他们的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>;
    };
  • 最后,我创建了一些 database指定为模板参数 Object_handler :

    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 之一.

我怎样才能做到这一点?

实际上Objects_handlers的使用可能存在问题在 database 的模板中类,那么还有一个问题:如何使用它?


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

最佳答案

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

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

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

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

问题是 - C++ 中的类模板不能像这样工作。即使对于特定的类模板,例如 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> ,仅适用于约束类型的概念,不适用于约束模板或值的概念。

关于c++ - C++20中模板类的概念,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69494666/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com