Шаблонная функция C ++ 11 с вызовом параметра rvalue
В каком-то классе 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){
}
}
Этот вопрос относится к функциям call - wind и callback ().