ссылка на функцию std :: get <1> в заголовке кортежа - PullRequest
4 голосов
/ 25 октября 2010

Как получить ссылку на функцию "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 ]

3 голосов
/ 25 октября 2010

Я думаю, что вы хотите:

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>();

Вроде некрасиво. Конечно, есть лучший способ, но это все, что у меня есть сейчас.

2 голосов
/ 25 октября 2010

После нескольких экспериментов я обнаружил, что возможно использовать лямбда-выражения:

#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); }
1 голос
/ 26 октября 2010

Код ниже работает для меня.Хитрость заключается в использовании указателя функции 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>;

ответь на мой вопросНочной сон может иметь большое значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...