gpt4 book ai didi

c++ - 有没有办法放置返回值?

转载 作者:太空宇宙 更新时间:2023-11-03 10:30:20 26 4
gpt4 key购买 nike

// VERSION 1
struct Range { int begin, end; };
inline Range getRange()
{
int newBegin, newEnd;
// do calculations
return {newBegin, newEnd};
}
struct Test
{
std::vector<Range> ranges;
inline void intensive()
{
ranges.push_back(getRange());
// or ranges.emplace_back(getRange());
// (gives same performance results)
}
};

// VERSION 2
struct Range { int begin, end; };
struct Test
{
std::vector<Range> ranges;
inline void intensive()
{
int newBegin, newEnd;
// do calculations
ranges.emplace_back(newBegin, newEnd);
}
};

版本 2 总是比版本 1 快。

事实是,getRange() 被多个类使用。如果我要应用版本 2,将会有很多代码重复。

此外,我不能将 ranges 作为非常量引用传递给 getRange(),因为其他一些类使用 std::stack 而不是 std::vector。我将不得不创建多个重载并有更多的代码重复。

是否有放置返回值的通用方式/习惯用法?

最佳答案

根据我们在评论中关于使用 SFINAE 允许放置在任何类型的容器上的讨论(无论它是否支持 emplaceemplace_back),这里是一个示例实现。

您只需要一种方法来检测 emplaceemplace_back 是否可用,并相应地调度调用。为此,我们将使用 SFINAE:

namespace detail
{
template<typename T, typename... Args>
auto emplace_impl(int, T& c, Args&&... pp)
-> decltype(c.emplace_back(std::forward<Args>(pp)...))
{
return c.emplace_back(std::forward<Args>(pp)...);
}

template<typename T, typename... Args>
auto emplace_impl(long, T& c, Args&&... pp)
-> decltype(c.emplace(std::forward<Args>(pp)...))
{
return c.emplace(std::forward<Args>(pp)...);
}
} // namespace detail

template<typename T, typename... Args>
auto emplace(T& c, Args&&... pp)
-> decltype(detail::emplace_impl(0, c, std::forward<Args>(pp)...))
{
return detail::emplace_impl(0, c, std::forward<Args>(pp)...);
}

感谢@DyP 提供了这个好得多 更好更短的 C++11 解决方案(参见评论)。之前基于特征的解决方案(修订版 3 和 4)要冗长得多。


使用起来非常简单:

template<typename Container>
void test_emplace()
{
Container c;
emplace(c, 3);
}

int main()
{
test_emplace<std::queue<int>>();
test_emplace<std::stack<int>>();
test_emplace<std::deque<int>>();
test_emplace<std::list<int>>();
test_emplace<std::vector<int>>();
}

我会让您弥合我的test_emplace() 用法示例和您的实际代码之间的差距,但现在应该不会太难。 ;)

关于c++ - 有没有办法放置返回值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18405522/

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