私はzip
関数を実装しようとしています。 zip
のパラメータはそれぞれwrapped<Ti>
で、Ti
はパラメータによって異なります。const-correctnessを持つvariadic zip関数を実装しています
zip
は、これらのwrapped<Ti>
秒を取り、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
の単一バージョンで一般的な、可変引数の場合を実装する方法はありますか?
これは、直接バインドされた参照が行う一時的な有効期間拡張の動作を持たないことを認識しています。 –
"..."を振ると効果があります。 :-) –
はい、OKです。 –