exp*_*ert 1 c++ boost boost-asio c++11
我正在审查Boost网站上的HTTP Server 3示例.连接类中有以下代码:
boost::tribool result;
boost::tie(result, boost::tuples::ignore) = request_parser_.parse(request_, buffer_.data(), buffer_.data() + bytes_transferred);
Run Code Online (Sandbox Code Playgroud)
其中,parse所申报
template <typename InputIterator>
boost::tuple<boost::tribool, InputIterator> parse(request& req, InputIterator begin, InputIterator end)
Run Code Online (Sandbox Code Playgroud)
我相信目标是将返回值复制tribool到局部变量.但是,boost::tie如果可以写一些类似的东西,那么通过临时对象()来做这件事有什么意义呢
boost::tuple<boost::tribool, char*> result = request_parser_.parse(request_, buffer_.data(), buffer_.data() + bytes_transferred);
// Our tribool is available via result.get<0>();
Run Code Online (Sandbox Code Playgroud)
?
好处不是性能,而是实用性和可读性:因为您对返回的第二个对象不感兴趣parse,所以不需要保留它.最好完全忽略它,只获得你真正感兴趣的结果,即tribool.使用的以下代码result将更加清晰.
事实上,当一个函数返回多个数据时,通常有用(就可读性而言)将其"拆分"以分别获得各个元素.例如,考虑std::set<T>::insert,它返回元素的迭代器以及指示它是否是新插入的布尔值.您发现以下哪个代码更清晰:
std::set<int> s;
std::pair<std::set<int>::iterator, bool> res = s.insert(42);
if (res.second)
{
doSomething(res.first);
}
Run Code Online (Sandbox Code Playgroud)
VS
std::set<int> s;
std::set<int>::iterator itInsertedElement;
bool isNewlyInserted;
tie(itInsertedElement, isNewlyInserted) = s.insert(42);
if (isNewlyInserted)
{
doSomething(itInsertedElement);
}
Run Code Online (Sandbox Code Playgroud)
在我看来,后者更容易阅读.
| 归档时间: |
|
| 查看次数: |
265 次 |
| 最近记录: |