函数std :: get< 1>的引用在元组标题中

时间:2010-10-25 18:12:13

标签: c++ c++11 tuples

如何获取特定元组实例的“get”函数的引用?

我最好的尝试如下,但不能编译g ++ 4.5.1

#include <tuple>
#include <string>

typedef std::tuple<int,std::string> Tuple;
auto t=(std::string& (Tuple&))(std::get<1,Tuple>);

编译错误是:

a.cc:5: error: invalid cast to function type ‘std::string&(Tuple&)’ 
a.cc:5: error: unable to deduce ‘auto’ from ‘<expression error>’

我想使用函数引用作为某些stl算法的输入。我真的有点惊讶于这对我来说是多么微不足道。

3 个答案:

答案 0 :(得分:3)

我想你想要:

namespace detail
{
    template <std::size_t I, typename... Types>
    decltype(&std::get<I, Types...>) get_function(std::tuple<Types...>*)
    {
        return &std::get<I, Types...>;
    }
}

template <std::size_t I, typename Tuple>
decltype(detail::get_function<I>((Tuple*)nullptr)) get_function()
{
    return detail::get_function<I>((Tuple*)nullptr);
}

auto t = get_function<I, Tuple>();
有点难看。当然有更好的方法,但这就是我现在所拥有的一切。

答案 1 :(得分:2)

经过一些实验,我发现可以使用lambda表达式:

#include <tuple>
#include <string>

typedef std::tuple<int, std::string> Tuple;
auto t = [] (Tuple& t) { return std::get<1> (t); };

如果你需要经常使用它,你总是可以写一个宏:

#define REFERENCE_GET(N, Tuple) \
    [] (Tuple &t) { return std::get<N> (t); }

答案 2 :(得分:1)

以下代码适合我。诀窍是使用函数指针typedef而不是函数引用typedef。 令我印象深刻的是,编译器不需要所有模板参数,但可以选择通过重载函数类型计算出缺少的参数。

#include <tuple>
#include <string>

typedef std::tuple<int,std::string> Tuple;
typedef std::string& (*PFun)(Tuple&);

PFun p1=(PFun)std::get<1U>;
PFun p2=(PFun)std::get<1U,int,std::string>;

在一行中:

auto p3=(std::string& (*)(Tuple&))std::get<1U>;

很抱歉回答我自己的问题。夜间睡眠可以产生很大的不同。