将元组转换为函数参数

时间:2016-05-06 16:56:42

标签: c++ variadic-templates

template<typename... Args>
class SomeClass
{
    using tuple_type = std::tuple<Args...>; // (ie: <bool,int,bool>)   
    tuple_type mytuple;
};

template<typename T, typename C, typename... I> // T is SomeClass
class SomeOtherClass
{       

      void fn(void(C::*f)(bool,int,bool)); // I want this
      // based on the T::tuple_type but I'm not sure how. 

};

如果我知道元组只有3个元素,我可以简单地使用tuple_element 3次,但我不知道。

1 个答案:

答案 0 :(得分:2)

写一个通用类型特征:

template <class C, class F>
struct mem_ptr;

template <class C, class F>
using mem_ptr_t = typename mem_ptr<C, F>::type;

专门针对tuple

template <class C, class... Args>
struct mem_ptr<C, std::tuple<Args...>> {
    using type = void (C::*)(Args...);
};

然后使用它:

void fun(mem_ptr_t<C, typename T::tuple_type> f);

这假设您希望void作为返回类型。

可以概括为将mem_ptr部分从元组拆分为func部分:

template <class C, class F>
struct mem_ptr {
    using type = F C::*;
};

template <class C, class F>
using mem_ptr_t = typename mem_ptr<C, F>::type;

template <class R, class T>
struct tuple_to_func;

template <class R, class... Args>
struct tuple_to_func<R, std::tuple<Args...>> {
    using type = R(Args...);
};

template <class R, class T>
using tuple_to_func_t = typename tuple_to_func<R, T>::type;

在这种情况下你想要:

void fun(mem_ptr_t<C,
    tuple_to_func_t<void, typename T::tuple_type>
> f);