如何在std :: transform中直接使用std :: get而不是Lambda函数?

时间:2017-11-25 15:46:16

标签: c++

我有std::vector std::typle

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, ??? > );

1 个答案:

答案 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));