【问题标题】:Where is disable_if in C++0x?C++0x 中的 disable_if 在哪里?
【发布时间】:2011-03-07 20:45:37
【问题描述】:

Boost 同时拥有enable_ifdisable_if,但C++0x 似乎缺少后者。为什么它被遗漏了? C++0x 中是否有元编程工具允许我根据enable_if 构建disable_if


哦,我刚刚注意到std::enable_if基本上就是boost::enable_if_c,而C++0x中没有boost::enable_if这样的东西。

【问题讨论】:

    标签: c++ templates boost c++11 enable-if


    【解决方案1】:

    冒着看起来很愚蠢的风险,只是在enable_if 的布尔模板参数中使用!expression 而不是expression 使其表现得像disable_if?当然,如果这个想法可行,您可以扩展它以编写一个具有类似disable_if 行为的类?

    好的,我相信你可以像这样实现disable_if

    template <bool B, typename T = void>
    struct disable_if {
        typedef T type;
    };
    
    template <typename T>
    struct disable_if<true,T> {
    };
    

    【讨论】:

    • 是的,我刚刚意识到enable_if 采用bool 而不是类型,因此否定条件是微不足道的。尽管如此,使用disable_if 会使代码更具可读性。
    • 好吧,我试了一下disable_if,虽然我相信它是正确的,但我的元编程能力有点欠缺。
    • 诺亚落入了和我一样的陷阱:)
    • 这可以更简单地写成:template&lt;bool B, typename T = void&gt; using disable_if = std::enable_if&lt;!B, T&gt;;
    • 在 VS2013 中使用 std::enable_if&lt;!expression&gt; 似乎会导致无法恢复的编译器错误。
    猜你喜欢
    • 2011-08-16
    • 2010-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-03
    • 1970-01-01
    • 2011-06-23
    相关资源
    最近更新 更多