10

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

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

例如,我希望迭代器实现 operator++ 、 operator-- 并声明所需的 typedef。

1>是否有可能实现这样一个执行设计合同的模板类?可能使用 static_assert ?

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

参考:自定义迭代器

4

2 回答 2

12

是否可以实现这样一个执行设计合同的模板类?可能使用 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" );
}

这是一个好的设计吗?

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

于 2012-09-20T10:19:26.023 回答
2

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

对代码进行额外检查总是一个好主意。

于 2012-09-20T09:52:56.190 回答