C++20中模板class的概念
Concept of template class in C++20
我不熟悉模板和概念的高级用法,所以这里有一个有点复杂的问题:
我对每个 Source
classes:
的许多特征有一些 Traits
的概念
template<typename _Traits>
concept Traits = requires
{
std::same_as<std::decay_t<decltype(_Traits::token)>, std::string_view>;
};
我有一些模板 class 使用这个概念来处理具有各种特征的 object_one
(例如,Source
classes 的一半returns 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
class模板中的使用可能有问题,所以还有一个问题:如何使用它?
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>
仅适用于约束类型的概念,不适用于约束模板或值的概念。
我不熟悉模板和概念的高级用法,所以这里有一个有点复杂的问题:
我对每个
的许多特征有一些Source
classes:Traits
的概念template<typename _Traits> concept Traits = requires { std::same_as<std::decay_t<decltype(_Traits::token)>, std::string_view>; };
我有一些模板 class 使用这个概念来处理具有各种特征的
object_one
(例如,Source
classes 的一半returnsobject_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
class模板中的使用可能有问题,所以还有一个问题:如何使用它?
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>
仅适用于约束类型的概念,不适用于约束模板或值的概念。