Обнаружение ссылочных типов в кортеже

я узнал о 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 следующим образом:

"insert into student (name,age,grade) values(?, ?, 2 )"

«pszname» и «iage» являются lvalues, поэтому они являются связующими переменными. 2 это значение, поэтому я могу сказать, что это литерал в выражении SQL.

Мой вопрос:

Как я могу определить, является ли элемент в кортеже rvalue или lvalue?

Например:

int k;
tuple<int&, int&&> t = forward_as_tuple(k, 2);

Первый элемент — это lvalue-ссылка, второй — это rvalue-ссылка.

Пожалуйста, используйте код C ++, чтобы сказать это. Код может иметь дело с кортежем varaidic.

0

Решение

У вас есть много полезных черт в #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;
2

Другие решения

вы можете использовать

std::is_rvalue_reference<std::tuple_element<Index, MyTuple>::type>::value
std::is_lvalue_reference<std::tuple_element<Index, MyTuple>::type>::value
3

По вопросам рекламы [email protected]