首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在MISRA C++之后实现CRTP

如何在MISRA C++之后实现CRTP
EN

Stack Overflow用户
提问于 2018-10-11 08:42:22
回答 3查看 703关注 0票数 11

我的团队正在开发一个嵌入式系统,我们需要遵循米斯拉C++。

我们正在重构代码以使用较少的虚拟方法,因此我们试图实现CRTP,以使用静态多态性而不是动态多态性。

但是我们有一个问题,静态多面体需要一个指针转换,所以我们的静态分析检查程序抱怨。

这是接口

代码语言:javascript
复制
template <typename T>
class UpdateMethod
{
protected:
    ~UpdateMethod() {}
 public:
    void operator()() const
    {
        // [MISRA Rule 5-2-7] violation:
        static_cast<const T*>(this)->update();
    }
};

以下是其中一个实现:

代码语言:javascript
复制
class A
    : public UpdateMethod<A>
{
 public:
    void update() const {}
};

在传递MISRA检查器时,它会抱怨static_cast (从ptr到ptr (e926)的转换)。

所以,我的问题是:有什么好的方法来实现CRTP,而不必压制MISRA警告,所以以安全的方式?

一个有关指针转换的相关问题:MISRA C++ 2008规则5-2-7违反:具有指针类型的对象不应直接或间接转换为无关的指针类型。 I在CRTP中有相同的错误。

编辑:如前所述,只有C++03,没有像boost这样的外部库。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-10-11 12:36:18

您可以使用相反的方法:

代码语言:javascript
复制
template <typename T>
class UpdateMethod : public T
{
 public:
    void operator()() const
    {
        this->update();
    }
};

class A_impl
{
 public:
    void update() const {}
};

typedef UpdateMethod<A_impl> A;
票数 6
EN

Stack Overflow用户

发布于 2018-10-11 09:26:04

好的问题是工具检查模板定义而不是模板实例化。

必须有办法帮助工具了解情况。最好的方法是C++2a概念,但最有可能的是工具不支持这一点,编译器可能也不支持。

其他解决方案是提供一个static_assert,希望该工具能够理解:

代码语言:javascript
复制
template <typename T>
class UpdateMethod
{
    static_assert(std::is_base_of<UpdateMethod<T>, T>::value, "This is CRTP");
protected:
    ~UpdateMethod() {}
 public:
    void operator()() const
    {
        static_cast<const T*>(this)->update();
    }
};

另一种方法是在施法时使用SFINAE并使操作符可用:

代码语言:javascript
复制
template <typename T>
class UpdateMethod
{
protected:
    ~UpdateMethod() {}
public:

    typename std::enable_if<std::is_base_of<UpdateMethod<T>, T>::value>::type
    operator()() const
    {
        static_cast<const T*>(this)->update();
    }
};

或者两者兼用。

尝试这个,我希望工具会理解这一点,并停止报告错误。如果不是的话,IMHO就是工具中的一个bug。

有人指出,必须使用C++03。在本例中,您可以使用boost,其中最初定义的辅助模板如果

票数 3
EN

Stack Overflow用户

发布于 2018-10-12 06:52:01

检查员不喜欢的是下拉式。我们能不选演员吗?派生类可以以正确的类型提供正确的值,例如在构造过程中。有点像预言片。它将花费您额外的一个存储指针。如下所示:

代码语言:javascript
复制
template <typename T>
class UpdateMethod
{
protected:
    T* implThis;
    ~UpdateMethod() {}
    UpdateMethod(T* implThis):implThis(implThis) {}
 public:
    void operator()() const
    {
        // this was the problematic cast
        implThis->update();
    }
};

class A
    : public UpdateMethod<A>
{
 public:
    A(): UpdateMethod(this) {}
    void update() const {}
};
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52755826

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档