Так что мне дали 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...
напрямую))
Я думаю, мне нужно сгенерировать список индексов и заняться черной магией.
Вот возможное решение:
#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;
}
Простая черта может сделать свое дело:
#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)