我了解了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 Ready 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++代码来说明这一点。该代码可以处理瓦拉迪克模板元组。
您可以使用
std::is_rvalue_reference<std::tuple_element<Index, MyTuple>::type>::value
std::is_lvalue_reference<std::tuple_element<Index, MyTuple>::type>::value
你在#include <type_traits>
中有很多有用的特征。您可能对std::is_rvalue_reference
和std::is_lvalue_reference
感兴趣。
例如,要检查第一个类型是否为右值:
bool r0 = std::is_rvalue_reference<std::tuple_element<0, decltype(t)>::type>::value;