C++11 static_assert:参数化错误消息
C++11 static_assert: Parameterized error messages
在我之前的问题中,我想使用static_assert将模板参数限制为特定的子类型。问题得到了解答,存档代码如下:
template <typename T>
struct X {
static_assert(std::is_base_of<Y,T>::value,"T must be derived from Y!");
};
现在,我想使错误消息更简洁。 即,我想说明哪种类型违反了此约束。 例如,如果类 A
不是从 Y
派生的,并且有人实例化X<A>
,则错误消息应打印"类型参数必须派生自 Y,但 A 不是"。
这可以通过标准库以某种方式实现吗?
我看到了两个挑战:
- 在编译时不使用 boost::mpl 组装字符串
- 检索与 T 实例化的类型的名称。名称应有意义,理想情况下与违规定义中使用的名称相同。我尝试了typeid(T).name(),但它只返回不可接受的损坏名称。我记得有某种宏可以返回某物的名称,但我再也想不起来了。
你不能
这样做。 static_assert
想要一个字符串文字。您无法将T
和Y
的语义标识组装到字符串文本中。
您可以希望编译器提供易于阅读的模板实例化堆栈回溯,并为您提供封闭类模板实例化的T
和Y
模板参数的值。
其他人也想到了这一点,例如 http://comments.gmane.org/gmane.comp.compilers.clang.devel/5073。
您仍然可以使用BOOST_MPL_ASSERT_MSG。它接受泛型类型作为参数,并尝试在错误消息中包含具体的类型名称。
更多信息和示例在这里:http://www.boost.org/doc/libs/1_49_0/libs/mpl/doc/refmanual/assert-msg.html
相关文章:
- C++错误消息*成员参考.**初学者*
- 如何通过参数抛出错误消息
- glad 导致 glfwSwapBuffers 返回错误消息
- FindPackageHandleStandardArgs.cmake:137 的 CMake 错误(消息):找不到 Boost (缺少:正则表达式)(找到合适的版本"1.72.0",
- 如何接受 [ENTER] 键作为无效输入并发送错误消息
- 重新定义预定义的 errno 错误消息 (E2BIG)
- SDL 映像:无法打开映像,仅显示错误消息
- 错误消息:使用"string* +="后"no match for 'operator+='"
- 错误消息"expected expression"....有人知道它为什么这么说吗?
- 在 Eclipse: "error: no match for 'operator='" 中获取错误消息
- GCC 警告和 gcc 错误消息之间的区别
- 为 c++ cin 上的输入数无效生成错误消息
- 来自带有mbedtls TLS的Mongoose Web服务器的错误消息
- 如何使用realsense摄像头调试ROS错误消息
- C++ 概念 - 需要括号中的概念会导致 2 条冲突的错误消息
- 编译器收到错误消息(textc.exe已停止)
- 结构数组的构造函数错误,错误消息:没有构造函数实例与参数列表匹配
- 使用 c++/WinRT Direct3D UWP Game DR 模板 Direct X11 的错误消息
- max_element() 给出非常奇怪的错误消息
- 不断收到错误消息,并非所有控制路径都返回值