gpt4 book ai didi

c++ - 如何禁用基于类模板参数的成员函数?

转载 作者:搜寻专家 更新时间:2023-10-30 23:51:06 24 4
gpt4 key购买 nike

为了说明这种情况,让我们假设一个最小的例子:一个 Vector 模板类将其维度作为非类型模板参数。当维度允许时,此类将提供 x()y()(等)访问器:

template <int N_dimension>
class Vector
{
public:
// ctors, etc.
int &x();

template <class = std::enable_if_t<(N_dimension>2)>> int &y();

private:
std::array<int, N_dimension> mData;
};

然而,这不起作用,因为 enable_if 只能应用于 deduced 模板参数。

我们目前的解决方法看起来很麻烦:

    template <int N=N_dimension, class = std::enable_if_t<(N>2)>> int &y();

此外,它还需要在定义中使用静态断言以确保它是万无一失的(因为现在客户端代码可以为 N 提供一个与实际维度不匹配的显式值。 编辑:或者如 SergeyA 所指出的,匿名第二个模板参数的显式值。


有没有更直接的方法用 C++ 表达它?

最佳答案

我会在这里取消 SFINAE,并像这样简单地将代码拆分为接口(interface)和私有(private)实现:

int& y() {
return y_impl(std::bool_constant<N > 2>{});
}

private:
int& y_impl(std::true_type ) {
// impl
}
int& y_impl(std::false_type ) {
static_assert(N > 2 /* always false */, "Wrong number of dimensions!");
}

此处的拆分是基于 y 的假设N <= 2 时不可编译, 以减少错误消息的困惑。如果不是这种情况,单个 static_asserty body 就足够了。

关于c++ - 如何禁用基于类模板参数的成员函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58068206/

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