3

我知道 std::get 已重载。而且我知道要提取重载,我需要强制转换为特定的签名。假设我需要一个指向 std::get 的指针,它将非常量引用从 std::tuple& 返回到第一个元素。以下是我的众多尝试之一(未编译):

auto f = static_cast<
    int& (*)(std::tuple<int,int>&) noexcept
>(
    &std::get<(size_t)0u, std::tuple<int,int>>
);

我应该如何指定这个 static_cast?

4

2 回答 2

7

元组 get 的签名是(直接取自 libstdc++):

 template<std::size_t __i, typename... _Elements>
    constexpr typename __add_ref<     
                      typename tuple_element<__i, tuple<_Elements...>>::type 
                    >::type 
    get(tuple<_Elements...>& __t) noexcept

因此,要获取的模板参数是元组的不同类型,而不是元组,因此您从中获取地址的函数应该是:

&std::get<(size_t)0u,int,int> 
于 2012-07-26T12:54:21.953 回答
3

您是否需要指向实际 std::get 的指针或具有相同行为的任何函数?如果是这样,您可以将其包装在 lambda 中:

auto f = [](std::tuple<int,int>& tuple) -> int&
{
    return std::get<0>(tuple);
}
于 2012-07-26T12:52:47.243 回答