是否可以在C++中测试属性说明符?

Is it possible to test for an attribute specifier in C++?

本文关键字:测试 属性 说明符 C++ 是否      更新时间:2023-10-16

我正在尝试根据应用于函数的属性实现不同的行为。基本上,我正在尝试查看是否可以在编译时测试属性的存在。

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 {
// ...
};

这是一个在线示例,显示了这两个选项。