2016-12-21 26 views
1

thread()関数のような関数を作成したい(N個のパラメータを取得する)。私は、このようなテンプレートを使用することがあると思う:その関数パラメータを持つ他の関数を呼び出すテンプレート関数を作成する

template <typename Func, typename Param1, ...> 
void function(params) 
{ 

} 

をしかし、私の機能のために、私はパラメータの限られた数を設定する必要があります。 thread()関数では、この関数にN個のパラメータを与えることができます。どのようにして関数を作成し、関数params内で同じパラメータを与えることが可能ですか?

template <typename Func, typename Param1, typename Param2, typename Param3 = typename()> 
    void Remote_function_caller(Func Function_name, Param1 P1, Param2 P2, Param3 P3 = Param3()) 
{ 
Function_name(P1, P2, P3); 
} 

void Tool1(int Data1, int Data2) 
{ 

} 

void Tool2(int Data1, int Data2, int Data3) 
{ 

} 

void main() 
{ 
     // Call tool 1 
     Remote_function_caller(Tool1, 5, 6); 

     // Call tool 2 
     Remote_function_caller(Tool2, 5, 6, 9); 
} 

私は可変引数テンプレートを使用することをお勧め...

+1

バリデーションテンプレートを調べます。 – NathanOliver

答えて

2

を、私は2つのパラメータを入力する必要がTool1を呼び出すが、呼び出し側は3つのパラメータを必要とするため、システムはエラーになります(と3つのパラメータとその機能をロード)するには:

template<typename Func, typename... Params> 
void function_caller(Func func, Params&&... params) { 
    func(std::forward<Params>(params)...); 
} 

ショート例:

#include <iostream> 
#include <utility> 

template<typename Func, typename... Params> 
void function_caller(Func func, Params&&... params) { 
    func(std::forward<Params>(params)...); 
} 

void foo(int x, int y) { 
    std::cout << __PRETTY_FUNCTION__ << std::endl; 
} 

void bar(int x, int y, int z) { 
    std::cout << __PRETTY_FUNCTION__ << std::endl; 
} 

int main() { 
    function_caller(foo, 5, 6); 
    function_caller(bar, 5, 6, 9); 

    return 0; 
} 

出力は:

void foo(int, int) 
void bar(int, int, int) 
+0

(typename ... Params)は何ですか? ((...)とは何ですか?すべてのパラームを意味しますか?システムはすべてのパラメータとしてそれを検出しますか? – Elh48

+0

@ Elh48それはすべてのバリデーショナルテンプレートについてです。ここでは良い出発点です:http://eli.thegreenplace.net/2014/variadic-templates-in-c/ –

+0

Thx man。それは有用だったtooooooooooだった – Elh48

関連する問題