是否可以在 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++没有reflection,答案是没有:不可能。
相反,我建议您做不同的设计选择以实现相同的目标。
例如,您可以在 运行 时间环境中使用 polymorfism。
如果您在编译时需要一些,您可以 "integrate" 结构中的常量表达式,稍后检查。
例如:
struct AbortError {
static constexpr bool critical = true;
// ...
};
或
struct AbortError: std::true_type {
// ...
};
Here 显示两个选项的在线示例。
我正在尝试根据应用于函数的属性实现不同的行为。基本上我想看看是否可以在编译时测试属性的存在。
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++没有reflection,答案是没有:不可能。
相反,我建议您做不同的设计选择以实现相同的目标。 例如,您可以在 运行 时间环境中使用 polymorfism。
如果您在编译时需要一些,您可以 "integrate" 结构中的常量表达式,稍后检查。
例如:
struct AbortError {
static constexpr bool critical = true;
// ...
};
或
struct AbortError: std::true_type {
// ...
};
Here 显示两个选项的在线示例。