2016-10-12 5 views
1

関数ポインタの可変パラメータパックを受け取るテンプレート関数を作成できますか?関数の引数のC++テンプレートパック

template<ReturnType (*FN)(), ReturnType (*FNX...)()> 
void run() { 
    ... 
    run<FNX...>(); 
    ... 
} 

私は、私は考えることができるすべての場所で...を配置しようとしたが、私はそれをコンパイルすることができません。これはサポートされていませんか?

答えて

2

あなたはこの構文を使用することができますが、それは本当に奇妙に見える:あなたはまた、より高度な処理を行うためにヘルパークラスを使用することができます

template <typename T> 
using function_ptr = add_pointer_t<enable_if_t<is_function<T>::value,T>>; 

template<function_ptr<void()>... Functions> 
void call_all() 
{ 
    initializer_list<int>{(Functions(), 0)...}; 
} 

template<void(*... Functions)()> 
void call_all() 
{ 
    initializer_list<int>{(Functions(), 0)...}; 
} 

は私もタイプを、エイリアスと思います:

using fp = function_ptr<string()>; 

template<fp First, fp... Others> 
struct helper 
{ 
    static void run() 
    { 
     helper<First>::run(); 
     helper<Others...>::run(); 
    } 
}; 

template<fp One> 
struct helper<One> 
{ 
    static void run() 
    { 
     DBG(One()); 
    } 
}; 

template<fp... Functions> 
void run() 
{ 
    helper<Functions...>::run(); 
} 

live demo

+0

素晴らしいですが、パックを実際の呼び出しに展開せずに(私の例のように)別のテンプレートにパックを渡すにはどうすればいいですか?関数を1つずつ呼び出して、次の関数を呼び出す前に戻り値の型をチェックする必要があります。私の実際のテンプレートには、最初の関数と残りの2つの引数があります。 – theduke

+0

@theduke編集を確認してください – krzaq

+0

大変です、ありがとうございました。 ftwを使って... – theduke

関連する問題