gpt4 book ai didi

c++ - 如何使用 sfinae 选择构造函数?

转载 作者:IT老高 更新时间:2023-10-28 12:59:32 25 4
gpt4 key购买 nike

在模板元编程中,可以在返回类型上使用SFINAE来选择某个模板成员函数,即

template<int N> struct A {
int sum() const noexcept
{ return _sum<N-1>(); }
private:
int _data[N];
template<int I> typename std::enable_if< I,int>::type _sum() const noexcept
{ return _sum<I-1>() + _data[I]; }
template<int I> typename std::enable_if<!I,int>::type _sum() const noexcept
{ return _data[I]; }
};

但是,这不适用于构造函数。假设,我要声明构造函数

template<int N> struct A {
/* ... */
template<int otherN>
explicit(A<otherN> const&); // only sensible if otherN >= N
};

但不允许 otherN < N .

那么,可以在这里使用 SFINAE 吗?我只对允许自动模板参数推导的解决方案感兴趣,所以

A<4> a4{};
A<5> a5{};
A<6> a6{a4}; // doesn't compile
A<3> a3{a5}; // compiles and automatically finds the correct constructor

注意:这是一个非常简化的示例,其中 SFINAE 可能是多余的,static_assert可能就足够了。但是,我想知道我是否可以改用 SFINAE。

最佳答案

您可以向模板添加默认类型参数:

template <int otherN, typename = typename std::enable_if<otherN >= N>::type>
explicit A(A<otherN> const &);

关于c++ - 如何使用 sfinae 选择构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14603163/

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