gpt4 book ai didi

作为接口(interface)的 C++20 概念

转载 作者:行者123 更新时间:2023-12-02 15:46:35 26 4
gpt4 key购买 nike

嘿,我正在尝试使用 c++20 概念设计一些没有任何运行时开销的接口(interface)。

我想出了以下(简化的)概念

/**
* @brief This concept defines an OSA Interface
*/
template<typename T, typename Task_T>
concept OSA_Layer_T = requires (T a) {
{T::getName(a)} -> std::same_as<std::string>; ///< Returns the name of the task (if no name is available return the ID as string)
{T::getId(a)} ->std::same_as<Task_T>; ///< returns the (underlying) ID of the task
};

由于每个操作系统都有自己的内部任务句柄类型(我不想使用 void*)我需要将实际的任务句柄作为模板参数传递给我的概念

但是我不确定如何使用这个模板定义一个类

我试过以下方法

这不起作用,因为缺少 Task_T

template<typename String_Type_T, OSA_Layer_T TaskType_T>
class Foo
{

};

这也行不通

template<typename Task_T>
template<typename String_Type_T, OSA_Layer_T<Task_T> TaskType_T>
class Foo
{

};

你能帮帮我吗?谢谢 :)

编辑:

澄清一下:这个 OSA 应该隐藏嵌入式 RTOS。大多数嵌入式 RTOS(如 FreeRTOS、EmbOS、RTX)都是用 C 编写的,因此 OSA 类只是调用用 C 编写的实际 RTOS 函数的静态成员的集合)通常你会使用虚函数来实现这个接口(interface)。然而,这样做的目的是尽可能减少开销。通常在我们静态链接的嵌入式目标上,因此所有未使用的模板函数都会被自动丢弃。如果成员是虚拟的,则无法删除未使用的成员。

(ARM 的 CMSIS 可用作嵌入式 RTOS 的 OSA。但是恕我直言,CMSIS 有一些缺点,例如过度使用 void*。这就是为什么我想创建一个类型安全的 OSA)

最佳答案

Since every OS has it's own internal Task Handle Type (and I do not want to use void*) I need to pass the actual Task Handle as a template parameter to my concept

第二部分实际上并不是第一部分。如果每个操作系统都有自己的内部任务句柄类型,方法应该是让成为概念的一部分。因为只有一个接口(interface):OSA_Layer_T .

使用一个更熟悉的概念可能更容易理解:迭代器。迭代器有一个他们取消引用的类型(不幸的是,这叫做 reference 。不幸的是因为它并不总是引用类型,它可能只是 int )。但是您不想这样定义您的概念:

template <typename I, typename Reference>
concept Iterator = /* ... */;

因为它不像Iterator<int>Iterator<string const&>是不同的接口(interface) - 如果类型是 Iterator , 然后它有一些 reference type,你应该可以要求它,这不会真正影响任何其他内容。

这通常称为关联类型

对于原题,表述应该是:

template<typename T>
concept OsaLayer = requires (T a) {
{ T::getName(a) } -> std::same_as<std::string>;

typename T::task_type;
{ T::getId(a) } -> std::same_as<typename T::task_type>;
};

如果您需要能够提供任务类型non-intrisuviely(如果您不控制 OsaLayer 类型),那么您可以这样做:

// specialize this for types that need to be OsaLayer's
template <typename T> struct task_type;
template <typename T> using task_type_t = typename task_type<T>::type;

template<typename T>
concept OsaLayer = requires (T a) {
{ T::getName(a) } -> std::same_as<std::string>;

typename task_type_t<T>;
{ T::getId(a) } -> std::same_as<task_type_t<T>>;
};

关于作为接口(interface)的 C++20 概念,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74017739/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com