我在完美转发方面遇到了一些困难.
这是我目前的理解水平:粘合模板+右值参考+ 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) 我正在使用可变参数模板(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::tuple的std::tuple,它编译罚款.
boost元组实现有问题吗?或者这是一个gcc bug?
我现在必须坚持使用Boost.Tuple.你知道任何解决方法吗?
谢谢.