我知道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?
我回答了[类似的问题(http://stackoverflow.com/q/7157210/20984)大约一年以前,关于'boost :: get'。即使我很高兴看到由于variadic模板,std :: tuple的实现更为简单,但我希望我们可以有一种方法来获得std :: tuple的类型,而不是必须明确地重复它们。通过'boost :: tuple'我们可以通过嵌套的typedefs来访问它们,但是这对于'std :: tuple'来说是不可能的,我们需要依靠一个中间模板来推断参数。如果我们只能输入模板参数包... – 2012-07-26 13:18:08
@LucTouraille:C++ 11不包含元编程容器和像boost这样的算法,因为它不具备提供类型的能力。然而,有一些辅助元函数可以在元组类型(tuple_cat,tuple_element,tuple_size)上操作,并且还有你自己的函数的能力,这些元组也可以使用可变参数模板,我认为当前的解决方案需要大约相同数量的努力,只是一种完全不同的思维方式。 – PlasmaHH 2012-07-26 13:34:03
当然,你总是可以使用一些间接的方法来推断参数。例如,在这种情况下,我们可以编写一个通用函数来获取正确的'get'版本,但不指定所有参数,但恕我直言,这是一个更多的工作,即使可能有点干净(使用中间函数比访问嵌套typedefs更灵活,例如,我们可以为'std ::'和'boost ::''tuples'创建重载)。 – 2012-07-26 13:48:43