![](/img/trans.png)
[英]Full specialisation of a class template using a C++20 concept of a non-type template parameter
[英]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_handler
的database
:
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.