static_assert确保设计合同
static_assert for ensuring design contract
作为开发团队的一员,我想确保在我们发布的自定义迭代器上实现一组函数(和运算符)。使用 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。
对代码进行其他检查总是一个好主意。
相关文章:
- 如何确保C++函数在定义之前声明(如override关键字)
- 如何确保在使用基于布尔值的两个方法之一调用方法时避免分支预测错误
- 使用Unique_ptr确保工厂中的对象唯一
- MESI协议和std::atomic-它是否确保所有写入立即对其他线程可见?
- C++需要帮助从用户那里获得一个整数,并确保它在另外两个整数之间
- 确保流程关闭
- 如何确保接受的C++模板类型使运算符重载?
- 确保编译时的特定 std::array 位置
- C++ 确保子类为常量提供自定义值
- 确保内存映射页位于内存中
- 确保套装新鲜度的有效方法
- C ++类型特征:确保子类实现方法
- 是否确保 2 个连续的 std::chrono::steady_clock::now() 不相等?
- 如何确保用户在一行上提示输入一次时输入名字和姓氏?
- 确保无变体的型号安全
- 确保特征将 AVX 矢量化用于特定操作
- 确保所有构造函数调用相同的函数 c++ 设计模式
- 如何确保 Visual C++ 不允许作用域枚举访问?
- 如何确保调用显式构造函数并允许大括号初始化?
- static_assert确保设计合同