Преобразование std :: tuple & lt; T … & gt; к Т

Так что мне дали std::tuple<T...>и я хочу создать указатель на функцию, принимающую T...в настоящее время это то, что у меня есть;

template<typename... Arguments>
using FunctionPointer = void (*)(Arguments...);

using FunctionPtr = FunctionPointer<typename std::tuple_element<0, V>::type,
typename std::tuple_element<1, V>::type,
typename std::tuple_element<2, V>::type>;

Однако я не могу найти способ сделать это, не вводя вручную каждый индекс из 0, ..., tuple_size<V>::value, FunctionPtr определяется в контексте, где V=std::tuple<T...> (также уже есть шаблон Variadic (следовательно, я не могу просто передать T... напрямую))

Я думаю, мне нужно сгенерировать список индексов и заняться черной магией.

4

Решение

Вот возможное решение:

#include <tuple>

// This is what you already have...
template<typename... Arguments>
using FunctionPointer = void (*)(Arguments...);

// Some new machinery the end user does not need to no about
namespace detail
{
template<typename>
struct from_tuple { };

template<typename... Ts>
struct from_tuple<std::tuple<Ts...>>
{
using FunctionPtr = FunctionPointer<Ts...>;
};
}

//=================================================================
// This is how your original alias template ends up being rewritten
//=================================================================
template<typename T>
using FunctionPtr = typename detail::from_tuple<T>::FunctionPtr;

А вот как вы бы это использовали:

// Some function to test if the alias template works correctly
void foo(int, double, bool) { }

int main()
{
// Given a tuple type...
using my_tuple = std::tuple<int, double, bool>;

// Retrieve the associated function pointer type...
using my_fxn_ptr = FunctionPtr<my_tuple>; // <== This should be what you want

// And verify the function pointer type is correct!
my_fxn_ptr ptr = &foo;
}
5

Другие решения

Простая черта может сделать свое дело:

#include <tuple>

template <typename> struct tuple_to_function;

template <typename ...Args>
struct tuple_to_function<std::tuple<Args...>>
{
typedef void (*type)(Args...);
};

Использование:

typedef std::tuple<Foo, Bar, int> myTuple;

tuple_to_function<myTuple>::type fp; // is a void (*)(Foo, Bar, int)
5

По вопросам рекламы [email protected]