检测元组中的引用类型

时间:2013-12-28 00:26:49

标签: c++ c++11 tuples boost-tuples

我了解了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”是左值,因此它们是绑定变量。 2是一个右值,所以我可以说它是SQL语句中的文字。

我的问题是:

如何判断元组中的元素是左值还是左值?

例如:

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

第一个元素是左值引用,第二个元素是右值引用。

请使用C ++代码来说明。代码可以处理varaidic模板元组。

2 个答案:

答案 0 :(得分:3)

你可以使用

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

答案 1 :(得分:2)

#include <type_traits>中有很多有用的特征。您可能对std::is_rvalue_referencestd::is_lvalue_reference感兴趣。

例如,要检查第一个类型是否为右值:

bool r0 = std::is_rvalue_reference<std::tuple_element<0, decltype(t)>::type>::value;