对于类模板,std :: enable_if优于static_assert有什么优势?

我想知道std::enable_ifstatic_asserts相比在防止模板实例化方面的优势。 This answer建议std::enable_if允许SFINAE,对于function templates来说,这是一个令人信服的论点。

此论点对class templates(和variable templates)合法吗?据我所知,没有涉及任何重载解决方案,这使得SFINAE(据我所知)不再相关,但我可能是错的。如果是这样,您能举个例子吗?

如果没有,我认为对于类问题,static_assert是解决给定问题(防止模板实例化)的更好解决方案,因为它可以说更明确,简洁和易读,并允许自定义错误消息。那是正确的还是我错过了SFINAE之外的其他观点?

iCMS 回答:对于类模板,std :: enable_if优于static_assert有什么优势?

如何使用SFINAE重载类的示例:

#include <type_traits>
#include <iostream>

template <typename,typename = void>
struct Foo;

template <typename Bar>
struct Foo <Bar,typename std::enable_if<std::is_same<Bar,int>::value>::type>
{
    Foo ()
    {
        std::cout << "Hello ";
    }
};

template <typename Bar>
struct Foo <Bar,bool>::value>::type>
{
    Foo ()
    {
        std::cout << "world!\n";
    }
};

int main()
{
    Foo<int>();
    Foo<bool>();
}

对于您不想进行重载但仍希望限制为一组类型的情况,我同意:

template <typename Bar>
class Foo
{
    static_assert(
        std::is_same<Bar,int>::value || 
        std::is_same<Bar,bool>::value,"Bar must be bool or int");
    
    // class stuff
};

...比以下内容更清晰,更简单

template <typename Bar,typename std::enable_if<
    std::is_same<Bar,int>::value ||
    std::is_same<Bar,bool>::type = true>
class Foo
{
    // class stuff
};

...尤其是因为使用第二个选项,编译器使用第一个参数第二个参数(在我们的示例中为Foo)引用true对象,对用户而言可能是神秘的。另外,如果您希望标头仅使用轻量级的声明来处理该类,则会更加混乱(请参阅如何进行here)。

,

该参数对类模板(和变量模板)合法吗?据我所知,没有涉及任何重载解决方案,这使得SFINAE(据我所知)不再相关,但我可能是错的。如果是这样,您能举个例子吗?

您可以专业课程模板,并且可以使用SFINAE在专业之间进行选择。它还将防止实例化此类(到那时可能是格式错误的类)/其专门化,而不是由于static_assert而无法编译。

,

std :: enabled_if在SFIANE中用于模板类,方法和...的特殊化。 static_assert用于在编译时检查合同,并提供有用的错误消息。

本文链接:https://www.f2er.com/1650613.html

大家都在问