c++ - 根据参数值产生编译时错误的构造函数
问题描述
我有一堂课C
,想做以下事情:
class C {
public:
C(const size_t aa, const size_t bb) { // aa and bb are compile time constants
// when aa + bb > 10 raise a compile time error
}
private:
size_t a;
size_t b;
}
构造函数C::C
应该类型检查并拒绝任何在编译时未知aa
且bb
不是正整数的值。如果该检查通过,编译器应该检查它们的总和。如果总和大于 10,编译器应该拒绝构造函数调用。
这是否可行(以及如何)仅使用 ISO C++11,而不依赖于特定的编译器?
解决方案
在compile-time,您所要求的只能使用模板,例如:
template<size_t aa, size_t bb>
class C {
public:
C() {
static_assert(aa > 0, "aa must be > 0");
static_assert(bb > 0, "bb must be > 0");
static_assert((aa + bb) <= 10, "aa + bb must be <= 10");
}
};
C<1, 2> c1; // OK
C<5, 6> c2; // compile error
否则,在运行时,您所能做的就是在错误输入时抛出异常,例如:
#include <stdexcept>
class C {
public:
C(const size_t aa, const size_t bb) : a(aa), b(bb) {
if (aa == 0)
throw std::runtime_error("aa must be > 0");
if (bb == 0)
throw std::runtime_error("bb must be > 0");
if ((aa + bb) > 10) {
throw std::runtime_error("aa + bb must be <= 10");
}
}
private:
size_t a;
size_t b;
};
C c1(1, 2); // OK
C c2(5, 6); // runtime error
推荐阅读
- c# - 在 wpf C# xaml 中创建 tabitem?
- c# - 如何通过 ajax 使用 Bootstrap4 自定义文件上传来上传文件
- java - while 循环里面的 for 循环,困惑?
- node.js - 将 Angular 应用程序部署到 Heroku 时出现“未找到”错误
- flutter - 颤振 location.altitude 返回 0.0
- ansible - 使用 Ansible nxos_config,我想从 bootflash 中删除一个文件:并发送一个 'y' 但我收到一个错误
- python - 如何查找数组的任何元素是否在pyspark的范围内
- python - 使用 oct2py 执行 .m 并存储在变量中(不将 .mat 存储在磁盘上)
- pandas - 如何在不聚合的情况下将熊猫组翻译为pyspark?
- r - 如何使用 rpy2 从 python 中使用 glmulti?