gpt4 book ai didi

c++ - 如何按值返回 "auto"返回类型函数

转载 作者:行者123 更新时间:2023-11-30 01:18:47 25 4
gpt4 key购买 nike

好吧,我不知道我是否用标题解释得很好,所以我只举一个例子。我试图想出一个函数来找到一系列 float 的中位数(还有一点额外)。这是函数:

    //get the median of an unordered set of numbers of arbitrary type without modifying the
//underlying dataset
template <typename InputIterator>
auto Median(
InputIterator const cbegin,
InputIterator const cend,
bool const abs = false // get the median of the absolute values rather than nominal values
) -> decltype(*cbegin)
{
typedef std::iterator_traits<InputIterator>::value_type T;

std::vector<T> data;
data.reserve(std::distance(cbegin, cend));

// get a copy of the values for sorting
for (InputIterator it = cbegin; it != cend; ++it)
{
if (abs)
data.push_back(std::abs(*it));
else
data.push_back(*it);
}

// find the median
std::nth_element(data.begin(), data.begin() + data.size() / 2, data.end());

return data[data.size() / 2];
}

这是我尝试编译时的输出:

warning C4172: returning address of local variable or temporary

我试过替换 decltype(*cbegin)std::remove_reference<decltype(*cbegin)>::typestd::iterator_traits<decltype(*cbegin)>::value_type但那些也不编译。

有没有简单的解决方法?如何返回 InputIterator 的类型积分?

编辑:这是一个基于反馈的固定版本:

    //get the median of an unordered set of numbers of arbitrary type without modifying the
//underlying dataset
template <typename RandomAccessIterator>
typename std::iterator_traits<RandomAccessIterator>::value_type Median(
RandomAccessIterator const cbegin,
RandomAccessIterator const cend,
bool const abs = false // get the median of the absolute values rather than nominal values
)
{
typedef std::iterator_traits<RandomAccessIterator>::value_type T;

std::vector<T> data(cbegin, cend);

// find the median
std::nth_element(data.begin(), data.begin() + data.size() / 2, data.end(),
[abs](T const a, T const b)
{
return abs ? std::abs(b) > std::abs(a) : b > a;
});

return data[data.size() / 2];
}

最佳答案

您可以将 iterator_traits 与模板参数一起使用,不需要 decltype:

template <typename InputIterator>
typename std::iterator_traits<InputIterator>::value_type
Median(
InputIterator const cbegin,
InputIterator const cend,
bool const abs = false
);

请注意 typename 关键字 - 这是您尝试时缺少的关键字。

关于c++ - 如何按值返回 "auto"返回类型函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22125424/

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