c++11 - 实现具有 const 正确性的可变参数 zip 函数

标签 c++11 reference const-correctness variadic-templates perfect-forwarding

我正在尝试实现 zip功能。 zip的参数分别为 wrapped<Ti> , 其中 Ti因参数而异。
zip拿这些wrapped<Ti> s 并产生 wrapped<tuple<T1&,T2&,...TN&>> ,或者换句话说,一个包装好的 tuple对其参数的引用。引用应保留 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 来实现通用的可变参数情况? ?

最佳答案

诚然,我没有处理可变参数模板的 C++0x 编译器,所以我无法对其进行测试。但这可能会奏效。

template<typename T>
    struct wrapped
{
    wrapped(T &&x)
    : m_x(std::forward<T>(x))
    {}

    typedef T type;

    T m_x;
};

template<typename... Types>
    wrapped<std::tuple<Types&&...>> zip(wrapped<Types>&&... x)
{
    return wrapped<std::tuple<Types&&...>>(std::tuple<Types&&...>(std::forward<Types>(x.m_x)...));
}

我不完全确定调用 zip 是否合法像这样:
zip(wrapped<T1>(value1), wrapped<T2>(value2));

您可能必须明确限定调用:
zip<T1, T2>(wrapped<T1>(value1), wrapped<T2>(value2));

关于c++11 - 实现具有 const 正确性的可变参数 zip 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6631782/

相关文章:

c++ - 简单参数包扩展 : expected ';'

pointers - 将 unique_ptr/shared_ptr 与 API 函数结合使用,通过指针将资源作为输出参数返回

c++ - 将 C++ lambda 复制到函数指针引用

android - 在另一个项目中包含项目

C++ 类接口(interface)传递给另一个成员变量

C++ 常量赋值

c++ - 使用 Eigen header 的模板函数

c++ - 是否有一些忍者技巧可以在声明后将变量设为常量?

c++ - 复制具有线程安全规则建议的非const参数的构造函数?

c++ - 哪个容器使用 map 或 set 或者其他?