3

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

template<int a, int b>
class foo {
}

现在我只想在 a + b 等于 10 时实例化它。我可以使用 std::enable_if 来实现吗?

第二个问题:如果我有 foo 类的成员

template<int a, int b>
class foo {
  int c;
}

我只想有 c 当

a = 5. 

如何使用 std::enable_if 做到这一点?这是使用 std::enable_if 的正确案例吗?

4

4 回答 4

13
template<int a, int b, typename T = typename std::enable_if<a + b == 10>::type>
class foo {
};

这应该可以完成工作;只需确保在实例化模板时从不明确提供第三个模板参数。


正如其他人提到的,static_assert是一个更好的选择。

于 2012-11-06T22:44:36.783 回答
12

我想您可以更好地使用 static_assert 来执行该约束而不是 enable_if

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;
}

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

于 2012-11-06T22:45:32.943 回答
5

使用 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;
}

如果 requires 子句为真,则该requires子句得到constant expression评估truefalse决定是否将其视为适当匹配,否则忽略它。

代码:https ://godbolt.org/z/yHh4Et

于 2019-11-15T12:47:03.567 回答
3

简单,不要用enable_if

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

template<>
struct Base<false>
{ };

template<int a, int b>
struct foo : Base<a+b == 10>
{
};
于 2012-12-18T15:19:26.653 回答