C++ c++;std::启用_if

C++ c++;std::启用_if,c++,c++11,C++,C++11,我对std::enable_if很陌生,不知道如何使用它。 我有一个模板类: template<int a, int b> class foo { } 如何使用std::enable_if实现这一点? 这是使用std::enable_if的正确案例吗?模板 template<int a, int b, typename T = typename std::enable_if<a + b == 10>::type> class foo { }; 福班{ };

我对std::enable_if很陌生,不知道如何使用它。 我有一个模板类:

template<int a, int b>
class foo {
}
如何使用std::enable_if实现这一点? 这是使用std::enable_if的正确案例吗?

模板
template<int a, int b, typename T = typename std::enable_if<a + b == 10>::type>
class foo {
};
福班{ };
这应该可以完成任务;只要确保在实例化模板时从不显式提供第三个模板参数



正如其他人提到的,
static\u assert
更合适。

我想如果需要,您可以更好地使用static\u assert来强制执行该约束,而不是启用

template<int a, int b>
class foo {
    static_assert(a+b==10, "a+b is not 10");
};

int main()
{
    foo<5,5> f; // will compile
    foo<1,5> f; // will fail to compile with error: a+b is not 10
    return 0;
}
模板
福班{
静态断言(a+b==10,“a+b不是10”);
};
int main()
{
foo f;//将编译
foo f;//将无法编译,错误为:a+b不是10
返回0;
}

enable_if主要用于根据类型特征有条件地从重载解析中删除函数和类,并为不同类型特征提供单独的函数重载和专门化。

简单,只是不要使用
enable_if

template<bool Ten>
struct Base
{
    int c;
};

template<>
struct Base<false>
{ };

template<int a, int b>
struct foo : Base<a+b == 10>
{
};
模板
结构基
{
INTC;
};
模板
结构基
{ };
模板
结构foo:Base
{
};
使用C++20 只需将
requires
添加到模板中即可实现:

template<int a, int b> requires (a + b == 10)
struct foo {
    int c;
};

int main() {
    foo<3, 7> ok;
    // foo<3, 8> doesnt_compile;
}
模板需要(a+b==10)
结构foo{
INTC;
};
int main(){
傅ok;
//foo不编译;
}
<> > <代码>要求子句得到一个<代码>常量表达式< /代码>,它计算为<代码> true < /COD>或<代码> false <代码>,因此决定是否认为这是一个适当的匹配,如果要求子句为真,或者忽略它。
代码:

我会选择这个解决方案,而不是基于std::enable_if的解决方案,以避免我的库的用户遇到一些严重的麻烦。是的,我只想学习如何使用enable_if。但这可能是一个非常糟糕的例子:)这不是
enable\u(如果
)的目的。它仅适用于函数模板中的推断类型。@KerrekSB:或禁用类模板的专门化。很长一段时间以来,它们都是
boost::enable_if
的核心用法,并且都仍然是有效的用例。请注意,这通常是在一个基础模板的多个专门化的上下文中进行的,以选择一个而不是其他模板,而不是完全禁用一个模板。@DavidRodríguez dribeas:这是一个很好的观点。到目前为止,我还没有将其用于类模板专门化……更简单:
template类foo{static const int b=10-a;
+1:虽然只强制一个特定的组合
static\u assert
更好,但它更强大,因为它允许生成一个基本模板的多个专门化,并根据Intating参数+1的属性选择一个或另一个,告诉我您可以使用算术和逻辑模板参数中的c表达式OK,现在我更改了要求:-)如果我有一个成员怎么办\n如果我在类foo:int c中有一个成员,并且我只想在模板参数a为5时拥有该成员怎么办?如何使用std::enable_if实现@Zoidberg@WhatABeautifulWorld你应该为5专门设置模板。因此你可能需要
tempate结构foo{inta,b;};模板结构foo{inta,b,c;};
template<bool Ten>
struct Base
{
    int c;
};

template<>
struct Base<false>
{ };

template<int a, int b>
struct foo : Base<a+b == 10>
{
};
template<int a, int b> requires (a + b == 10)
struct foo {
    int c;
};

int main() {
    foo<3, 7> ok;
    // foo<3, 8> doesnt_compile;
}