gpt4 book ai didi

C++:如何组合多个概念?

转载 作者:行者123 更新时间:2023-12-03 10:05:10 25 4
gpt4 key购买 nike

这个标题似乎受到了很多批评。但是,我发现这个概念很难搜索。它在 C++ 领域也相对较新,学校仍在教学C++11 .
避免 XY 问题的动机和背景
现在,我正在使用 concepts 检测一个嵌入式设备项目。作为逆向工程(和学习)过程的一部分。设备库和设备 API 的问题在于,有各种各样的编程禁忌源于文字设备(或设备产品线)功能:

  • 硬编码设置
  • 扩展
  • 设备功能的特定捆绑包或子集
  • 它利用宏和辅助类来构建结构(结构构建结构)
  • 没有简化假设:跨平台和设备测试的大量错误处理包

  • 代码结束了——无论开发人员多么努力,我知道没有更好的结果可能——非常冗长和复杂。换句话说,它在功能上很简单,但很难理解。
    通常,我可能会形成 structs包装捆绑包并隐藏硬编码内容,但现在我使用 concepts因为它们允许我构建我的接口(interface)命名空间,我(一个单独的开发人员)可以更有效地更改或更新知识。我对使用该设备的设备了解得越少越好。
    有了概念,我还可以保护我编写的代码,这些代码依赖于我的概念化内容,不受设备制造商和 API 提供者的更改传播。

    在利用这些概念时,我试图尽早选择如何构建我的代码。
    为了做出决定,我需要知道 concepts 是否可行以原子方式编写,然后组合成 conceptual structures .例如:
    // real code

    // Concepts

    template < typename ContextInfo>
    concept ExtensibleDeviceContext = requires(ContextInfo & contextInfo, const char * name,
    bool optional, void * devFeatures)
    {
    { contextInfo.addDeviceExtension(name, optional, devFeatures)};
    };

    template< typename ContextInfo>
    concept ExtensibleInstanceContext = requires(ContextInfo & contextInfo, const char * name,
    bool optional)
    {
    { contextInfo.addInstanceLayer(name, optional) };
    { contextInfo.addInstanceExtension(name, optional) };
    };

    // Some dummy functions

    template<ExtensibleDeviceContext Cx>
    void foo(Cx &context, const char *name, bool optional, void *devFeatures)
    {
    context.addDeviceExtension(name, optional, devFeatures, version);
    context.addDeviceExtension(FOO_MACRO_1);
    }

    template<ExtensibleInstanceContext Cx>
    void bar(Cx &context, const char *name, bool optional)
    {
    context.addInstanceLayer(name, optional);
    context.addInstanceExtension(BAR_MACRO);
    }
    我想要做的是,本质上,将概念组合成模板上下文“ <...>”中的一组概念:
    // psuedo-code: what I am trying to achieve

    template<typename PortInfo: {ExtensibleInstanceContext, ExtensibleDeviceContext}>
    void foobar(
    PortInfo port,
    const char *portName,
    bool optional,
    const char *devName,
    bool devOptional,
    void *devFeatures
    )
    {
    foo(port, devName, devOptional, devFeatures);
    bar(port, portName, optional);
    };

    是这种 concept组成可能吗?如果是这样,是否可以在上面概述的模板语法中做到这一点?如果没有,是否有一些“更好”或“有意”的方式来代替?

    最佳答案

    您可以约束 foobarrequires子句,或命名您想要的概念的连接。

    template<typename PortInfo>
    requires ExtensibleInstanceContext<PortInfo> && ExtensibleDeviceContext<PortInfo>
    void foobar(
    PortInfo port,
    const char *portName,
    bool optional,
    const char *devName,
    bool devOptional,
    void *devFeatures
    )
    {
    foo(port, devName, devOptional, devFeatures);
    bar(port, portName, optional);
    };
    或者
    template <typename ContextInfo>
    concept ExtensibleDeviceInstanceContext = ExtensibleInstanceContext<ContextInfo> && ExtensibleDeviceContext<ContextInfo>;

    template <ExtensibleDeviceInstanceContext PortInfo>
    void foobar(
    PortInfo port,
    const char *portName,
    bool optional,
    const char *devName,
    bool devOptional,
    void *devFeatures
    )
    {
    foo(port, devName, devOptional, devFeatures);
    bar(port, portName, optional);
    };
    您可以使用 && , ||!用它们通常的 bool 含义来组合概念。

    关于C++:如何组合多个概念?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66011716/

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