Mos*_*oot 2 c++ templates c++-concepts c++20
我是模板和概念的高级使用新手,所以这里有一个有点复杂的问题:
我Traits对每个Source类别的许多特征都有一些概念:
template<typename _Traits>
concept Traits = requires
{
std::same_as<std::decay_t<decltype(_Traits::token)>, std::string_view>;
};
Run Code Online (Sandbox Code Playgroud)
我有一些模板类使用这个概念来处理object_one各种特征(例如,一半的Source类返回object_one):
template <concepts::Traits _Traits>
class Object_one_handler final
{
static std::string handle_object(const object_one& obj) {/*...*/}
};
Run Code Online (Sandbox Code Playgroud)
然后我有了来自不同集合的Objects_handlers各种对象的处理程序的概念:{object_one, object_two, object_three}SourcesTraits
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>;
};
Run Code Online (Sandbox Code Playgroud)
最后,我创建了一些database指定为模板参数的内容Object_handler:
template<concepts::Objects_handlers _handler>
class database
{...};
Run Code Online (Sandbox Code Playgroud)
(实际上所有概念都有额外的要求,但这里并不重要)
所以问题出在最后一个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>;
^^^^^^^
};
Run Code Online (Sandbox Code Playgroud)
我无法检查_Objects_handlers没有模板参数的方法(显然),并且我无法正确设置必须是Traits.
我怎样才能做到这一点?
实际上,这可能是类Objects_handlers模板中使用的问题database,那么又一个问题:如何使用它?
PS 这可能是 XY 问题,也可能根本不是概念……也许与策略模式的组合会更有用,但仍然想尝试创建这个可能无用但可行的概念。
让我们大大减少这个问题。
template <typename T>
struct C {
void f();
};
Run Code Online (Sandbox Code Playgroud)
现在,您的目标是编写一个概念,它采用任何类模板(例如C)并检查它的每个特化是否都有一个名为 的无效成员函数f。
template <template <typename> class Z>
concept HasF = requires (Z<???> z) {
z.f();
};
Run Code Online (Sandbox Code Playgroud)
问题是 - C++ 中的类模板不能像这样工作。即使对于特定的类模板,例如C,您也不能要求每个专业化都具有f. 没有办法确保像某人、某个地方没有添加:
template <> struct C<std::vector<std::list<std::deque<int>>>> { };
Run Code Online (Sandbox Code Playgroud)
您所能做的就是检查特定类型是否具有名为 的空成员函数f。那就是:
template <typename T>
concept HasF = requires (T t) { t.f(); };
Run Code Online (Sandbox Code Playgroud)
类型约束语法template <Concept T>仅适用于约束类型的概念,不适用于约束模板或值的概念。
| 归档时间: |
|
| 查看次数: |
2392 次 |
| 最近记录: |