是否可以在C++中测试属性说明符?
Is it possible to test for an attribute specifier in C++?
我正在尝试根据应用于函数的属性实现不同的行为。基本上,我正在尝试查看是否可以在编译时测试属性的存在。
struct AbortError
{
[[noreturn]] static void error(const std::string& msg)
{
std::cerr << "critical error: " << msg << std::endl;
std::abort();
}
}
struct LogError
{
static void error(const std::string& msg)
{
std::cerr << "non-critical error: " << msg << std::endl;
}
}
是否可以测试[[noreturn]]的存在?
我希望实现类似
template <typename ErrorPolicy>
void function()
{
// ...
if constexpr(std::is_noreturn<ErrorPolicy::error>::value)
{
performCriticalCleanup();
}
ErrorPolicy::error("Bad things happened.");
}
由于C++没有反射,答案是否定的:这是不可能的。
相反,我建议你做的是做出不同的设计选择,以实现相同的目标。 例如,您可以在运行时环境中使用多歧义。
如果你在编译时需要一些,你可以在结构中"集成"一个常量表达式,稍后再检查。
例如:
struct AbortError {
static constexpr bool critical = true;
// ...
};
或
struct AbortError: std::true_type {
// ...
};
这是一个在线示例,显示了这两个选项。
相关文章:
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 如何导出包含具有"std::unique_ptr"值的"std::map"属性的
- 无法编译 rtmidi 测试 cmidiin.cpp 文件, 非法指令
- 尽管测试成功,CppUnit测试核心仍被丢弃.为什么
- C++概念:如何使用'concept'检查模板化结构的属性?
- 数据成员SFINAE的C++17测试:gcc vs clang
- 子目录是否继承属性,例如add_definitions,include_directories和父Cmakelist.t
- 通过指向指针数组的指针访问子类的属性
- MSVC是否支持C++11样式的属性而不是__declspec
- 如何使用重载的相等(==)运算符向测试用例添加描述
- 为什么二进制搜索在我的测试中不起作用
- 从父数组测试用例构造二叉树失败
- 试图对缓存进行跨步测试,但程序并没有结束
- 有什么好的方法可以让系统调用代理允许在单元测试中进行模拟
- OpenGL在启用深度测试时不会丢弃我的碎片
- 是否可以在C++中测试属性说明符?
- 如何使用 cmake 在C++中快速检查(基于属性的测试)工作?
- 谷歌模拟:测试对象的某个属性
- 测试提升属性树是存储基元还是子树
- 测试引发特定的异常类型,并且异常具有正确的属性