我的团队正在开发一个嵌入式系统,我们需要遵循米斯拉C++。
我们正在重构代码以使用较少的虚拟方法,因此我们试图实现CRTP,以使用静态多态性而不是动态多态性。
但是我们有一个问题,静态多面体需要一个指针转换,所以我们的静态分析检查程序抱怨。
这是接口
template <typename T>
class UpdateMethod
{
protected:
~UpdateMethod() {}
public:
void operator()() const
{
// [MISRA Rule 5-2-7] violation:
static_cast<const T*>(this)->update();
}
};以下是其中一个实现:
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这样的外部库。
发布于 2018-10-11 12:36:18
您可以使用相反的方法:
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;发布于 2018-10-11 09:26:04
好的问题是工具检查模板定义而不是模板实例化。
必须有办法帮助工具了解情况。最好的方法是C++2a概念,但最有可能的是工具不支持这一点,编译器可能也不支持。
其他解决方案是提供一个static_assert,希望该工具能够理解:
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并使操作符可用:
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。
发布于 2018-10-12 06:52:01
检查员不喜欢的是下拉式。我们能不选演员吗?派生类可以以正确的类型提供正确的值,例如在构造过程中。有点像预言片。它将花费您额外的一个存储指针。如下所示:
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 {}
};https://stackoverflow.com/questions/52755826
复制相似问题