1

私は、関数を1行の関数を除いて全く同じにするいくつかの関数を持っています。多くのタイプの関数のパラメータとして関数ポインタを受け入れる関数用のテンプレート関数を作成します。

Func1(type parameter); 

Func2(type1 parameter1,type2 parameter2); 

FuncFunc(FunctionPointer functionPointer){ 
    funcVar; 
    ... 
    functionPointer(funcVar,....); 
    ... 
} 

int main(){ 
    FuncFunc(Func1); 

    FuncFunc(Func2(,type2Object)); 
} 

私はC++でこれを行うことができますとにかくあります:私は、私はその1ライン分の関数ポインタとして渡すことができます一つの機能と、これらの機能のすべてを交換したいですか?

+2

これは確かにC++で行うことができます。しかし、あなたの質問はいくぶん不明です。 "1行の関数を除いて全く同じことをするいくつかのc関数" - これは完全には解析できません。あなたは外挿して、例を挙げることができますか? –

答えて

2

あなたが達成しようとしていることは明確ではありませんが、あなたのコードが有効なC++にどのように翻訳されるかの例がここにあります。

template<typename F> 
void GuncFunc(const F& fPtr) { 
     std::string funcVar = "Foo!"; 
     fPtr(funcVar); 
} 

template<typename ...T> 
void FuncFunc(const std::function<void(T...)>& fPtr) { 
     std::string funcVar = "Foo!"; 
     fPtr(funcVar); 
} 

またはより簡単には、バリアントを使用する:

template<typename T1, typename T2> 
void Func(T1 par1, T2 par2) { 
     std::cout << par1 << " " << par2 << std::endl; 
} 

はその後、我々はあなたが望む任意の関数を受け入れるFuncFuncを行う必要があります。まずは、引数の最大数を使用してFuncを定義してみましょう最後にFuncFuncを使用します。

auto Func1 = std::bind(Func<float, std::string>, 3.14f, std::placeholders::_1); 
auto Func2 = std::bind(Func<std::string, int>, std::placeholders::_1, 42); 
FuncFunc(std::function<void(std::string)>(Func1)); 
FuncFunc(std::function<void(std::string)>(Func2)); 
return 0; 

またはGuncFuncstd::bindまたはラムダの選択

// Using std::bind 
GuncFunc(std::bind(Func<float, std::string>, 3.14f, std::placeholders::_1)); 
GuncFunc(std::bind(Func<std::string, int>, std::placeholders::_1, 42)); 

// Or using lambdas: 
GuncFunc([](std::string s){Func<float, std::string>(3.14f, s);}); 
GuncFunc([](std::string s){Func<std::string, int>(s, 42);}); 

は、あなたの質問の範囲外のようですが、あなたはhere何か役に立つ、thereを見つけたりthis問題であります。

とにかく、あなたはおそらくlambdas,std::function,std::bindまたはvariadic templatesが必要になります。

+1

'std :: bind'の代わりにlambdaを使うこともできます(おそらく好きでしょう) – qxz

+0

@qxz私の答えを更新しました。 – Sergey

関連する問題