gpt4 book ai didi

c++ - 如何 SFINAE 启用返回 `auto` 的成员函数

转载 作者:太空狗 更新时间:2023-10-29 23:06:47 26 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]; }
};

但是,如果有问题的函数(上例中的 _sum())具有自动检测的返回类型,例如 _func()这个例子

template<int N> class A
{
/* ... */
private:
// how to make SFINAE work for _func() ?
template<int I, typename BinaryOp, typename UnaryFunc>
auto _func(BinaryOp op, UnaryFunc f) const noexcept -> decltype(f(_data[0]))
{ return op(_func<I-1>(op,f),f(_data[I])); }
};

还可以做些什么来让 SFINAE 在这里?

最佳答案

跟随 David Rodríguez - dribeas,以下代码按预期工作:

template<int N> class A
{
int min_abs() const noexcept
{
return _func<N-1>([](int x, int y)->int { return std::min(x,y); },
[](int x)->int { return std::abs(x); });
}
private:
int _data[N];

template<int I, typename BinaryOp, typename UnaryFunc>
auto _func(BinaryOp op, UnaryFunc f) const noexcept
-> typename std::enable_if< I>,decltype(f(_data[0]))>::type
{ return op(_func<I-1>(op,f),f(_data[I])); }

template<int I, typename BinaryOp, typename UnaryFunc>
auto _func(BinaryOp op, UnaryFunc f) const noexcept
-> typename std::enable_if<!I>,decltype(f(_data[0]))>::type
{ return f(_data[I]); }
};

严格来说,我们还必须确保二元运算符op 返回正确的类型。为了简单和简洁的答案,我把它留给读者去弄清楚......

关于c++ - 如何 SFINAE 启用返回 `auto` 的成员函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14589150/

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