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

时间:2017-07-04 19:47:51

标签: c++ templates attributes typetraits

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

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.");
}

1 个答案:

答案 0 :(得分:1)

由于 C ++ 没有reflection,答案是:这是不可能的。

相反,我建议你做的是做出不同的设计选择,以达到同样的目标。 例如,您可以在运行时环境中使用 polymorfism

如果在编译时需要一些,可以在结构中“集成”一个常量表达式,稍后再检查。

例如:

struct AbortError {
  static constexpr bool critical = true;
  // ...
};

struct AbortError: std::true_type {
// ...
};

Here一个显示两个选项的在线示例。