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

0

Я узнал о 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.

  • 0
    Извините за множественные правки! Теперь, если я правильно понимаю, вы хотите определить, являются ли элементы в кортеже lvalue или rvalue. Что именно вы планируете делать с этой информацией?
  • 0
    @0x499602D2: 0x499602D2: Как я понимаю, это заполнение values(..) контента. ( Или прямое значение).
Показать ещё 1 комментарий
Теги:
c++11
tuples
boost-tuples

2 ответа

2
Лучший ответ

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

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню