3

std::get がオーバーロードされていることは知っています。そして、オーバーロードを抽出するには、特定の署名にキャストする必要があることを知っています。std::tuple& から非 const ref を最初の要素に返す std::get へのポインターが必要だとします。以下は私の多くの試みの1つです(コンパイルされません):

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 へのポインターが必要ですか、それとも同じ動作をする任意の関数が必要ですか? もしそうなら、ラムダでラップすることができます:

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