2012-07-26 122 views
2

我知道std :: get被重载。而且我知道要提取超载,我需要将其转换为特定的签名。假设我需要一个指向std :: get的指针,它返回来自std :: tuple &的第一个元素的非const引用。下面是我的许多尝试之一(不编译):如何获得指向std :: get <0,元组<int,int>>)的指针?

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

我该如何指定此static_cast?

回答

7

元组获取的签名(直接的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> 
+0

我回答了[类似的问题(http://stackoverflow.com/q/7157210/20984)大约一年以前,关于'boost :: get'。即使我很高兴看到由于variadic模板,std :: tuple的实现更为简单,但我希望我们可以有一种方法来获得std :: tuple的类型,而不是必须明确地重复它们。通过'boost :: tuple'我们可以通过嵌套的typedefs来访问它们,但是这对于'std :: tuple'来说是不可能的,我们需要依靠一个中间模板来推断参数。如果我们只能输入模板参数包... – 2012-07-26 13:18:08

+0

@LucTouraille:C++ 11不包含元编程容器和像boost这样的算法,因为它不具备提供类型的能力。然而,有一些辅助元函数可以在元组类型(tuple_cat,tuple_element,tuple_size)上操作,并且还有你自己的函数的能力,这些元组也可以使用可变参数模板,我认为当前的解决方案需要大约相同数量的努力,只是一种完全不同的思维方式。 – PlasmaHH 2012-07-26 13:34:03

+0

当然,你总是可以使用一些间接的方法来推断参数。例如,在这种情况下,我们可以编写一个通用函数来获取正确的'get'版本,但不指定所有参数,但恕我直言,这是一个更多的工作,即使可能有点干净(使用中间函数比访问嵌套typedefs更灵活,例如,我们可以为'std ::'和'boost ::''tuples'创建重载)。 – 2012-07-26 13:48:43

3

你需要一个指向一个实际的std :: get或任何具有相同行为的函数的指针吗?如果是的话你可以把它包装在一个lambda:

auto f = [](std::tuple<int,int>& tuple) -> int& 
{ 
    return std::get<0>(tuple); 
} 
相关问题