在类中使用static_assert-如何
using static_assert in a class - how?
我试图在编译时简单地检查一个值到新类型的转换是否保留了该值。STL中可能有一些东西可以为我做这件事,但我看不出来,所以我写了一个。它是有效的,但我想把它转换成一个类,以便让其他人的使用更简单。我无法做到这一点,我觉得我错过了一些显而易见的东西。
这很好:
template <typename T, typename Q>
constexpr bool checkV(const Q x)
{return x == (T)x && ((x < 0) == ((T)x < 0));}
static_assert(checkV<unsigned int>(-7), "No");
但通话很笨拙,所以我想要更像的东西
CheckIt<unsigned int>(-7)
所以我尝试了
template<typename T>
class CheckIt {public:
template<typename Q>
constexpr CheckIt(const Q x) {static_assert(checkV<T>(x), "No");}
};
我尝试过const和constexpr的各种组合(发现参数不能是constexpr,这很烦人(。我所尝试的一切都导致g++抱怨x不是构造函数中的常量表达式。
我错过了什么?checkv和构造函数总是用常量来调用,比如-7。checkv((很乐意在编译时进行评估,我看不出在哪里使用构造函数来包装会给编译器增加任何额外的负担,但很明显它确实这样做了。注意,我需要这一点来在C++11中工作,但我不知道以后的版本会在哪里有所帮助。我在运行时使用assert进行检查没有问题,但我想要常量的编译时解决方案。TIA。
将变量传递给函数将不起作用,因为它不是常量表达式,因此static_assert不会接受它。
您可以尝试将该值作为模板参数传递。
template <typename T, typename Q>
constexpr bool checkV(const Q x)
{
return x == static_cast<T>(x) && ((x < 0) == (static_cast<T>(x) < 0));
}
template <typename T, typename Q, Q N>
void CheckIt() {
static_assert(checkV<T, Q>(N));
}
int main() {
constexpr auto val = -7;
CheckIt<unsigned int, decltype(val), val>();
}
但它并没有干净多少。
编辑:您也可以使用"好"的旧宏的
#define CheckIt(x,y) static_assert(checkV<x, decltype(y)>(y));
int main() {
CheckIt(unsigned int, -7);
}
相关文章:
- 如何循环打印顶点结构
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 如何将stdout重定向到stderr
- Mongodb c++驱动程序:如何查询元素的数组
- 当回溯以零开始时,如何调试崩溃
- 如何反转整数参数包
- 如何使用Google Mock来模拟gettimeofday()
- 如何使用默认参数等选择模板专业化
- 如何从C++中的依赖类型中获得它所依赖的类型
- 如何导出包含具有"std::unique_ptr"值的"std::map"属性的
- 如何运行位于boost/libs/python/example/tutorial目录中的hello.cpp和Jamfil
- 如何使用 < 和 > 命令获取 c++ 中的输入和输出?
- 如何确定我已使用非编码文件到达 EOF?
- 如何编写一个接受如下断言消息的自定义断言函数:assert(false) << "assertio
- 如何正确调用 Assert::ExpectException
- 如何使用assert函数
- 如何将assimp(assert importer)交叉编译到像ps4或XBox1这样的平台
- 标准c++ assert()是如何工作的,以及如何重新定义它
- 如何避免CRT对话框与assert(.)函数
- assert函数如何在失败时返回文件名和代码行