関数型言語 (Haskell など) と同様の単純な構成構文を使用するために、C++ で演算子のオーバーロードを使用して関数型構成をコーディングしようとしています。私の目的は、コンポジションで通常の裸の C++ 関数を使用することです。これまでにコーディングしたオーバーロードは 2 つあります。
operator%
これは 2 つのfunction<int(int)>
パラメーターを使用し、operator*
テンプレート型をパラメーターとして使用します。
operator%
うまく機能しますが、 main() では、まず通常の関数をラップfunction<int(int)>
しoperator%
て、入力パラメーターとして受け入れる必要があります。operator*
テンプレート パラメーターを使用するオーバーロードに移行することで、この追加の手順を回避したいと考えています。通常の関数を のテンプレート パラメーターにバインドすることは可能だと思いましたoperator*
が、コンパイラはエラーを報告します。
composingFunc.cpp11.cpp: In function ‘int main()’:
composingFunc.cpp11.cpp:28:12: error: invalid operands of types ‘int(int)’ and ‘int(int)’ to binary ‘operator*’
cout<<(f*g)(5)<<endl;
この問題を解決する方法はありますか?テンプレート パラメーターの使用operator*
は必須ではありません。他の方法がある場合は、ここで提案してください。
ソースコードは次のとおりです。
#include<iostream>
#include<functional>
using namespace std;
int f(int n)
{ return 2*n; }
int g(int n)
{ return n+1; }
function<int(int)> operator%(function<int(int)> f, function<int(int)> g)
{
return [=](int x){ return f(g(x));};
}
template<typename T>
function<int(int)> operator*(const T &f, const T &g)
{
function<int(int)> f1=f,f2=g; //this is encapsulated here so it is not
//necessary to repeat the same in main
//for every functional composition
return [=](int x){ return f1(f2(x));};
}
int main()
{
function<int(int)> f1=f, f2=g; //I want to encapsulate this step into operator*
cout<<(f1%f2)(5)<<endl; //this works well
cout<<(f*g)(5)<<endl; //error in this line
}
編集: Zac によって提供されたソリューションでは、関数の引数の 1 つにクラス型を使用します (標準では、演算子のオーバーロードで少なくとも 1 つの列挙型またはクラス型の引数を使用することが必須です) およびテンプレート型の引数。次に、通常の C++ 関数は喜んで両方の引数にバインドします。したがって、最終的な演算子のオーバーロードは非常に単純です。
template<typename T>
function<int(int)> operator*(function<int(int)> f, T g)
{
return [=](int x){ return f(g(x));};
}
通常の関数は、単純な(f*g)(x)
構文を使用して構成できます。