实现具有常量正确性的可变参数 zip 函数
我正在尝试实现 zip
功能。 zip
的参数均是 wrapped
,其中 Ti
因参数而异。
zip
采用这些 wrapped
并生成 wrapped
>,或者换句话说,对其参数的引用的包装元组
。引用应该保留const
性质。
这是我对带有一个参数的 zip 的第一次尝试,它通常不起作用:
#include <utility>
#include <tuple>
// implement forward_as_tuple as it is missing on my system
namespace ns
{
template<typename... Types>
std::tuple<Types&&...>
forward_as_tuple(Types&&... t)
{
return std::tuple<Types&&...>(std::forward<Types>(t)...);
}
}
template<typename T>
struct wrapped
{
wrapped(T &&x)
: m_x(std::forward<T>(x))
{}
T m_x;
};
template<typename T>
wrapped<std::tuple<T&&>>
zip(wrapped<T> &&x)
{
auto t = ns::forward_as_tuple(std::forward<T>(x.m_x));
return wrapped<std::tuple<T&&>>(t);
}
int main()
{
wrapped<int> w1(13);
wrapped<int> &ref_w1 = w1;
// OK
zip(ref_w1);
const wrapped<int> &cref_w1 = w1;
// XXX won't compile when passing a const reference
zip(cref_w1);
return 0;
}
有没有办法用单个版本的 zip 实现通用的可变情况?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
诚然,我没有处理可变参数模板的 C++0x 编译器,所以我无法测试它。但这可能会起作用。
我不完全确定像这样调用
zip
是否合法:您可能必须明确限定该调用:
Admittedly, I don't have a C++0x compiler that handles variadic templates, so I can't test it. But this might do the trick.
I'm not entirely sure if it is legal to call
zip
like this:You may have to explicitly qualify the call:
这是我得出的解决方案:
使用
zip
采用WrappedTypes...
而不是wrapped...
并不令人满意解决方案,但它有效。Here's the solution I arrived at:
Having
zip
takeWrappedTypes...
instead ofwrapped<T>...
isn't as satisfying a solution, but it works.