小编Tho*_*tit的帖子

完美转发和std :: tuple(或其他模板类)

我在完美转发方面遇到了一些困难.

这是我目前的理解水平:粘合模板+右值参考+ std :: forward和一个特殊的魔法模式被激活,其中模板扣除规则与通常的含义不同,但是精心设计以允许完美转发.示例:

template <typename T>
void outer(T&& t)
{
   inner(std::forward<T>(t)); // perfect forwarding activated
}
Run Code Online (Sandbox Code Playgroud)

但是,如果T实际上是一个模板化的类,会发生什么?例如,我怎样才能完善std :: tuple?如果使用T &&作为aboce,我将丢失元组中包含的对象的所有类型信息.
但是以下代码不起作用:

template <typename... Args>
void outer(std::tuple<Args...>&& t) 
{
   inner(std::forward<std::tuple<Args...>>(t));
   use_args_types_for_something_else<Args...>(); // I need to have Args available
}

int main()
{
   std::tuple<int, double, float> t(4, 5.0, 4.0f);
   outer(t);
}
Run Code Online (Sandbox Code Playgroud)

最后的gcc快照说:

error: cannot bind 'std::tuple<int, double, float> lvalue to
std::tuple<int, double, float>&&
Run Code Online (Sandbox Code Playgroud)

很明显,我们仍然处于一般的非模板情况,其中左值不能绑定到右值参考."完美转发模式"未激活

所以我试图偷偷摸摸地将我的元组作为模板模板传递:

template <
  typename... Args
  template <typename...> class T
>
void outer(T<Args...>&& t) 
{
   inner(std::forward<T<Args...>>(t));
   use_args_type_for_something_else<Args...>(); …
Run Code Online (Sandbox Code Playgroud)

c++ templates tuples perfect-forwarding c++11

6
推荐指数
1
解决办法
1560
查看次数

Boost.Tuple是否与C++ 0x可变参数模板兼容?

我正在使用可变参数模板(gcc 4.5)并遇到这个问题:

template <typename... Args>
boost::tuple<Args...>
my_make_tuple(Args... args)
{
   return boost::tuple<Args...>(args...);
}

int main (void)
{
    boost::tuple<int, char> t = my_make_tuple(8, 'c');
}
Run Code Online (Sandbox Code Playgroud)

GCC错误消息:

sorry, unimplemented: cannot expand 'Arg ...' into a fixed-length argument list
In function 'int my_make_tuple(Arg ...)'
Run Code Online (Sandbox Code Playgroud)

如果我更换的每次出现boost::tuplestd::tuple,它编译罚款.
boost元组实现有问题吗?或者这是一个gcc bug?

我现在必须坚持使用Boost.Tuple.你知道任何解决方法吗?
谢谢.

c++ gcc variadic boost-tuples c++11

5
推荐指数
1
解决办法
1518
查看次数