Я узнал о std::forward_as_tuple
. Я использую эту технологию в своем проекте:
template<class... Ts>
tuple<Ts&&...> values(Ts&&... ts) // yes, values is renamed forward_as_tupe
{
return tuple<Ts&&...>(std::forward<Ts>(ts)...)
}
class C_SQL { ...... }; // MySQL C API, SQL statement encapsulation
// operator% is well defined.
char pszname[32];
int iage;
C_SQL sql;
sql % "insert into student (name,age,grade)"
% values(pszname, iage, 2 );
Затем я могу получить строку с инструкциями MySQL C API Prepared Statement следующим образом:
"insert into student (name,age,grade) values(?, ?, 2 )"
"pszname" и "iage" являются lvalues, поэтому они являются обязательными переменными. 2
является rvalue, поэтому я могу сказать, что это буквальный в SQL-заявлении.
Мой вопрос:
Как я могу определить, является ли элемент в кортеже значением rvalue или lvalue?
Например:
int k;
tuple<int&, int&&> t = forward_as_tuple(k, 2);
Первый элемент - это lvalue-reference, второй - rvalue-reference.
Пожалуйста, используйте C++ код, чтобы сообщить об этом. Код может обрабатывать varaidic template tuple.
У вас много полезных черт в #include <type_traits>
. Вероятно, вас интересуют std::is_rvalue_reference
и std::is_lvalue_reference
.
Например, чтобы проверить, является ли первый тип значением r:
bool r0 = std::is_rvalue_reference<std::tuple_element<0, decltype(t)>::type>::value;
вы можете использовать
std::is_rvalue_reference<std::tuple_element<Index, MyTuple>::type>::value
std::is_lvalue_reference<std::tuple_element<Index, MyTuple>::type>::value
values(..)
контента. (?
Или прямое значение).