static_assert确保设计合同

static_assert for ensuring design contract

本文关键字:合同 确保 assert static      更新时间:2023-10-16

作为开发团队的一员,我想确保在我们发布的自定义迭代器上实现一组函数(和运算符)。使用 STL 迭代器类型作为基类型会有所帮助,但是由于某些原因(超出我的控制范围),我们决定不强制实施 STL 兼容性。迭代器由同一团队和整个公司的人员使用。

我想设计一个模板类,该类使用迭代器类型并根据设计协定进行测试。

例如,我希望迭代器实现运算符++,运算符-并声明所需的typedefs。

1> 是否可以实现这样一个强制执行设计契约的模板类? 可能使用 static_assert ?

2>如果是,这是一个好的设计吗?

参考 : 自定义迭代器

是否可以实现这样一个强制执行设计契约的模板类? 可能使用 static_assert ?

为了检查是否存在特定方法(与此示例非常相似):

struct Hello
{
};
struct Generic {
    int operator++()
    {
        return 5;
    }
};

// SFINAE test
template <typename T>
class has_operator_plusplus
{
    typedef char one;
    typedef long two;
    template <typename C> static one test( decltype(&C::operator++) ) ;
    template <typename C> static two test(...);
public:
    enum { value = sizeof(test<T>(0)) == sizeof(char) };
};

int main(int argc, char *argv[])
{
    // the first check breaks the build
    //static_assert( has_operator_plusplus<Hello>::value, "has no operator" );
    static_assert( has_operator_plusplus<Generic>::value, "has no operator" );
}

这是一个好的设计吗?

是的,因为通过破坏构建,错误被非常快地捕获,并且类的用户不必阅读文档(大多数人通常在编程时跳过该部分)

是的,你可以实现这样的模板类。您可以使用 SFINAE 测试各种成员是否存在,如果它们不正确,static_assert 。虽然我不确定你为什么要在 C++11 世界中定义 typedefs。

对代码进行其他检查总是一个好主意。