c++模板类的概念



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

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

    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处理程序的概念,从不同的SourcesTraits设置{object_one, object_two, object_three}的各种对象:

    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_handlersdatabase类的模板中使用可能会有问题,所以还有一个问题:如何使用?


注:它可以是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>只适用于约束类型的概念,而不适用于约束模板或值的概念。

相关内容

  • 没有找到相关文章

最新更新