2016-05-06 2 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

はやる理由があります'(typename T :: tuple_type&)'の代わりに '(bool、int、bool)'を使いたいとしますか? – Felics

+0

私はコールバックの引数を格納するタプルを使用しています。 get <>の使用により複雑な[](タプル)ではなく、[](bool a、int b、bool c)ラムダを渡すことができます(パラメータには良い名前があります)。それらをローカル変数に格納して意味のある名前を付けます。 – James

答えて

2

ジェネリック型特性書く:これは、あなたがリターンとしてvoidをしたいと仮定し

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

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

し、それを使用しますタイプ。


は、FUNC部分にタプルからmem_ptr一部を分割し、これを一般化でした:

したいと思います。その場合には
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); 
関連する問題