gpt4 book ai didi

c++ - 使用 std::enable_if 的正确方法

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:37:21 25 4
gpt4 key购买 nike

这些类之间有什么区别?正是这些带有 enable_if 的方法。

/// Alias of std::enable_if...
template <bool B, typename T = void>
using Enable_if = typename std::enable_if<B, T>::type;

Template<typename T, std::size_t N>
class A {
...
template <std::size_t NN = N,
typename = Enable_if<NN == 2>>
Some_Return_Type
method(param1, param2)
{}

template <std::size_t NN = N,
typename = Enable_if<NN == 1>>
Some_Return_Type
method(param1)
{}


};


Template<typename T, std::size_t N>
class B {
...
Enable_if<N == 2, Some_Return_Type>
method(param1, param2)
{}

Enable_if<N == 1, Some_Return_Type>
method(param1)
{}
};

在我遇到的情况下,使用 enable_if 的正确方法是什么:

  • 至少有 2 个方法,仅参数不同且名称相同,但只有其中一个必须是“事件的”(如果 N == 1 其中一个,如果 N == 2 另一个)。
  • 只有一种方法会在 N == 0 时激活,而在其他情况下不激活。

我想得到这样的东西:

Obj<int, 2> obj2;
Obj<int, 0> obj0;
Obj<int, 1> obj1;

如果我在 IDE 中编写 obj0. 它只显示 N == 0 的方法; obj1. 只有 N == 1, ... .

谢谢。

最佳答案

请注意 enable_if旨在触发 SFINAE:如果模板参数替换在其立即上下文中失败,则不是编译错误。

这正是 class A 中发生的事情:当用户调用a.method(...)时, 编译器尝试实例化成员函数模板 method , 代入 NN带有常量的参数,可能会失败。

但是,在 B::method 的情况下“错误”替换发生在类模板期间 B实例化,当编译器替换 N 时.失败发生在远离参数的直接上下文的地方,在本例中为 template<typename T, std::size_t N> class B .

这就是为什么在第二种情况下你会得到一个编译错误,而不是 SFINAE。

因此,要根据类模板 参数启用/禁用成员函数,请使用第一种方法,根据需要组合条件。例如:

template <typename T, std::size_t N>
class A {
template <std::size_t NN = N, typename = std::enable_if_t<NN == 2 || NN == 0>>
void method(int, int)
{}

template <std::size_t NN = N, typename = std::enable_if_t<NN == 1 || NN == 0>>
void method(int)
{}
};

更新:enable_if 的工作原理。大致上,可以这样实现:

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

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

注意如果第一个参数是false , enable_if没有内部 type , 所以 enable_if<false, int>::type会是病式的。这就是触发 SFINAE 的原因。

关于c++ - 使用 std::enable_if 的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57449491/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com