【发布时间】:2014-06-24 19:00:49
【问题描述】:
在某些 O 类中,我有模板函数 test2:
struct A{int value;};
struct O{
A value;
template<typename Args>
static void test2(Args &&args){
std::cout << std::endl << "!!!" << std::is_rvalue_reference<decltype(args)>::value << std::endl;
}
};
然后,我想从另一个调用这个函数:
template<typename Args>
void test(Args &&args){
using t = decltype(std::forward<Args>(args).value);
std::cout << std::is_rvalue_reference<decltype(args)>::value;
std::cout << std::is_rvalue_reference<decltype(std::forward<Args>(args).value)>::value;
std::cout << std::is_rvalue_reference<t>::value;
// All ok
O.test2(std::forward<Args>(args).value);
// Alvays rvalue, even if agrs is lvalue
O::template test2<t>(
std::forward<t>(
std::forward<Args>(args).value
)
);
// Nor work at all, cant cast A to A&&
O::template test2<t>(
std::forward<Args>(args).value
);
);
}
http://coliru.stacked-crooked.com/a/3bbf040904845a54
如果我只是传递std::forward<Args>(args).value 而不指定模板类型,它会正确推断类型,但是如果我必须传递类型怎么办,我应该如何调用函数呢?
我似乎无法正确手动推断类型。
更新
我需要明确指定参数,因为我有这样的功能(伪代码):
//initially call wind from somewhere.
// Tuple defined in class and is std::tuple
template<class Callback, class ...Args>
void wind(Tuple&& tuple, Callback &&callback){
using elementT = decltype(std::get<index>(std::forward<Tuple>(tuple)));
///
/// !!! Problem here !!!
///
callback.template operator()<elementT, Args...>( std::get<index>(std::forward<Tuple>(tuple)) ); // std::get automatically return &/&&
// recursivly call wind until the end
wind<Callback, Args...>( std::forward<Tuple>(tuple), std::forward<Callback>(callback));
}
// callback looks like:
struct CallMe{
// Args provide type info. No function arguments here.
template<class Data, class ...Args>
void operator(Data &&data){
}
}
这个问题与调用 - wind 和 callback() 函数有关。
【问题讨论】:
-
当您在
wind中说data时,您是指callback吗?如果是这样,我认为您在那里有一些未定义的行为,因为在您在callback上调用operator()之前,callback可能会被移动到operator()参数中。 -
不,我用真实的应用程序代码更新了问题。
标签: c++ templates c++11 rvalue-reference