我試圖實現zip
函數。 zip
的參數各爲wrapped<Ti>
,其中Ti
因參數而異。使用常量正確性實現可變參數壓縮函數
zip
取這些wrapped<Ti>
s併產生wrapped<tuple<T1&,T2&,...TN&>>
,或換句話說是對其參數的引用的包裝tuple
。參考文獻應該保留const
-ness。
這是我在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
一個版本一般,可變參數的情況下的方法嗎?
只是爲了確保,你意識到這不會有直接引用的臨時生命週期擴展行爲,對吧? –
灑上「...」直到它工作。 :-) –
是的,沒關係。 –