我是模板和概念高级用法的新手,所以这里有一个有点复杂的问题:
-
我对每个
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
处理程序的概念,从不同的Sources
和Traits
设置{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_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>
只适用于约束类型的概念,而不适用于约束模板或值的概念。