如何使用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