2016-05-06 115 views
3
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

是否有一个原因,为什么你想要'(bool,int,bool)'而不是'(typename T :: tuple_type&)'? – Felics

+0

我正在使用一个元组来存储回调的参数。你可以传递一个[](bool a,int b,bool c)lambda(并且参数的名字是好的),而不是由于使用get <>而更复杂的[](元组)将它们存储在局部变量中以给它们一个有意义的名字。 – James

回答

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