2017-08-12 7 views
2

私はバリデーショナルテンプレートを勉強しています。私はこのようなことができるかどうか疑問に思っていました。任意の数とタイプのパラメータを持つ(任意の戻り値型の) 1回の呼び出しで。私が使用できるコードは次のようなものです:可変個数の複数のパラメータパッケージテンプレートC++

call(f1,f2,f3, 2.2,3); 
call(f4,f5, 2.2, "Hello", 'a'); 

もちろん、渡された引数を受け入れることができます。 は私が関数に渡されるパラメータの固定数で動作するバージョンを書いた:

template<typename T, typename U> 
void fcall(const T& t1, const T& t2, U&& u){ 
    u(t1, t2); 
} 

template<typename... F, typename T, typename U> 
void fcall(const T& t1, const T& t2, U&& u, F&&... f){ 
    u(t1, t2); 
    fcall(t1, t2, f...); 
} 

私が機能する前にパラメータを渡すことが好きではない場合であっても、それが動作します。

これは私が書いたものであり、それは動作しません:

template<typename P, typename U> 
void fcall2(U&& f, const P& param){ 
f(param); 
} 

template<typename... P, typename... F, typename U> 
void fcall2(U&& f, F&&... func, const P&... param){ 
f(param...); 
fcall2(func..., param...); 
} 

私はそれが唯一の好奇心だ、役に立たないことを知っています。 提案がありますか?

答えて

1

あなたはそのようなパックを1つしか持てません。

理論的には、愚かな複雑なテンプレートメタプログラミングを使用した後で要素を呼び出す前に要素を呼び出すことができる、パック内のユニークな分割点を見つけることができます。

簡単に記述することであろう。

template<class...Fs> 
auto call_all(Fs...fs){ 
    return [&](auto&&...args){ 
    (void(fs(args...)),...); 
    }; 
} 

(C++ 17)。

call_all(f1,f2,f3)(3.13, "hello"); 
:同じように使用