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次,但我不知道。
答案 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);