c++ - 检测元组中的引用类型

标签 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 准备语句字符串:

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

“pszname”和“iage”是左值,所以它们是绑定(bind)变量。 2 是一个右值,所以我可以说它是 SQL 语句中的文字。

我的问题是:

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

例如:

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

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

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

最佳答案

你可以使用

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

关于c++ - 检测元组中的引用类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20809678/

相关文章:

c++ - std::cout 中的 'operator<<' 不匹配

c++ - 我在理解 [basic.scope.pdecl]/7 时遇到一些困难

c++ - 我应该从使用 boost::shared_ptr 切换到 std::shared_ptr 吗?

scala - 在 Scala 中命名元组变量

c++ - 如何使用 decltype 获取引用的类型?

c++ - GLM 无法使用 g++/C++11 进行编译

c++ - GCC 4.4 不实现 C++11 范围循环。它支持哪些其他范围循环语法?

c# - C# 中的元组展开类似于 Python

python - 从两个不同的列表中删除重复的行?

c++ - 如何根据 std::is_same 检查返回不同类型