enable_if只在C++11中存在吗?

5

在 C++ 参考文档网站搜索 enable_if,它被称为只是一个 C++11 的特性。

然而,我使用 GCC 编译器在 C++98 版本上编译了自己的 enable_if 版本,它完美地工作,并似乎可以在任何版本的 C++ 上使用(输出值为 1):

#include <iostream>

namespace egg
    {
    template<bool B,
        typename T = void>
        struct enable_if
        {
        };

    template<typename T>
        struct enable_if<true, T>
        {
        typedef T type;
        };
    }

int main()
    {
    egg::enable_if<1 == 1, int>::type x = 1;
    std::cout << x << std::endl;
    }

我这样说是否正确:enable_if 实际上是任何 C++ 版本都支持的功能,但只是在 C++ 标准中引入了它,还是有其他原因呢?


3
它是在C++11中添加的。关于它不需要任何新的语言特性,你说得对,事实上在C++11获批之前,它早就在Boost中可用了。 - gd1
enable_if和其他模板元编程/类型特征API(http://en.cppreference.com/w/cpp/header/type_traits)不需要任何编译器魔法/实现,因此如果您设法制作自己的API,它将在您使用的任何C++版本中工作。除了像`is_move_constructible`这样的API,它需要C++11的移动构造函数和R-Value引用。 - Brandon
这个非常好的参考资料指出它自C++11以来就可用:http://en.cppreference.com/w/cpp/types/enable_if - πάντα ῥεῖ
即使你被迫使用C++98/C++03,也不要自己实现它们(除非是为了学习目的),很可能Boost已经有了它们。 - gd1
1
自从C++14以来,可以使用助手std::enable_if_t代替typename std::enable_if<>::type。其他type_trait也是如此。 - Alejandro
@πάνταῥεῖ - 这是我用来确认它来自C++11的网站! :) 在我看来是个很棒的网站。 - user3476093
1个回答

7

enable_if在C++11标准中添加(source)。它不依赖于任何C++11标准的特性,因此您可以看到这个可能的实现,它可以在C++03中自己编码。

template<bool B, class T = void>
struct enable_if {};

template<class T>
struct enable_if<true, T> { typedef T type; };

这只是使用模板元编程SFINAE

您还可以使用boost::enable_if,而无需编写自己的代码,这也与C++98/03兼容。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接