将元组传递给辅助类

时间:2016-05-16 07:42:51

标签: c++ templates tuples variadic-templates

我需要一些帮助来实现我的程序设计。所以我有一个包含我想要的东西的元组,通过这个调用创建

auto t1 = getMyTuple();

但我想创建一个帮助类,以便我可以重载<<操作员,所以当我打电话

std::cout << my_tuple_helper;

它会打印出每件东西。

我有一个帮助类,但我不知道如何将t1加入它...它看起来像

template<typename... Args>
class my_tuple_helper
{
  public:
  std::tuple<Args...> my_tup;

  my_tuple_helper(std::tuple<Args... t)
  {
    my_tup = t;
  }

 //or

  my_tuple_helper(Args... args)
  {
    my_tup = std::tuple<Args...>(args...);
  }

};

这些构造函数中的任何一个的问题是我不知道如何在创建对象时传递模板,如果它类型为auto:

auto t1 = getMyTuple();
my_tuple_helper<???> mth(t1);

我有一些编译的东西看起来像这样

template<typename T>
class my_tuple_helper
{
  public:
  T my_tup;

  my_tuple_helper(T t)
  {
    my_tup = t;
  }
};

我可以致电

auto t1 = getMyTuple();
my_tuple_helper<decltype(t1)> mth(t1);

但我不喜欢T可能是什么的事实,我宁愿有一个std :: tuple my_tup而不是T my_tup(我甚至不确定这是否有用)。

有没有人有任何想法如何将一个存储在auto对象中的std :: tuple放到我的帮助器类中,以便我可以作为std :: tuple对象(在类中)访问它。

提前谢谢

2 个答案:

答案 0 :(得分:1)

你可以为那个

做一个功能
template<typename... Args>
my_tuple_helper<Args...>
make_my_tuple_helper(const std::tuple<Args...>& tup)
{
    return my_tuple_helper<Args...>(tup);
}

并使用它

auto t1 = getMyTuple();
auto mth = make_my_tuple_helper(t1);

答案 1 :(得分:1)

执行此操作的常用方法是创建一个工厂方法,为您推导出模板参数。所以你要my_tuple_helper看起来像这样:

template<typename... Args>
class my_tuple_helper
{
  public:
  std::tuple<Args...> my_tup;

  my_tuple_helper(std::tuple<Args...> t)
      : my_tup {std::move(t)}
  { }
};

然后写一个像这样的工厂方法:

template <typename... Args>
my_tuple_helper<Args...> 
make_tuple_helper (const std::tuple<Args...>& t) 
{
    return { t };   
}

Live Demo

然后,如果你想输出你的元组,你可以在一次调用中完成,如下所示:

auto t1 = getMyTuple();
std::cout << make_tuple_helper(t1);