std::vector<std::tuple<int,int>> vt;
我可以通过算法std::transform
将矢量的内容转换为另一个矢量,如下所示:
std::vector<int> vi(vt.size());
std::transform( vt.begin(), vt.end(), vi.begin(), [](auto &v) -> int {
return std::get<0>(v);
} );
当然我也可以使用一个功能:
int myget(const std::tuple<int,int>& t)
{
return std::get<0>(t);
}
std::vector<int> vi(vt.size());
std::transform( vt.begin(), vt.end(), vi.begin(), myget );
但是可以直接使用std::get
作为std::transform
中的实际参数吗?
我的意思是这样的事:
std::transform( vt.begin(), vt.end(), vi.begin(), std::get<0, ??? > );
答案 0 :(得分:4)
是的,这是可能的,但我不推荐 。由于std::get
有多个重载,因此您需要static_cast
到右侧。
static_cast<int&(*)(std::tuple<int, int>&)>(&std::get<0, int, int>)
真的,通过重复两次模板参数,看起来并不好看。如果你希望演员阵容是通用的,那将会很长。
相反,要缩短lambda,可以删除-> int
,因为返回类型会自动推断出来:
std::transform( vt.begin(), vt.end(), vi.begin(), [](auto &v) {
return std::get<0>(v);
} );
总有一天,我们可以写下这个:
std::transform(vt.begin(), vt.end(), vi.begin(), [](auto &v) => std::get<0>(v));