2

関数型言語 (Haskell など) と同様の単純な構成構文を使用するために、C++ で演算子のオーバーロードを使用して関数型構成をコーディングしようとしています。私の目的は、コンポジションで通常の裸の C++ 関数を使用することです。これまでにコーディングしたオーバーロードは 2 つあります。

  1. operator%これは 2 つのfunction<int(int)>パラメーターを使用し、
  2. 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)構文を使用して構成できます。

4

2 に答える 2

2

ダニエルが指摘したように、演算子オーバーロードの引数の 1 つは、クラスまたは列挙型でなければなりません。したがって、への呼び出しは、関数ポインタ型の代わりにf*gインスタンス化する必要があります。function<int(int)>この問題には 2 つのオプションがあります。

  1. 次のように、演算子の代わりに関数を使用します

    template<typename T>
    function<int(int)> multi(T x, T y)
    
  2. 関数パラメータの 1 つを `function として宣言します

    template<typename T>
    function<int(int)> operator*(function<int(int)> x, T y)
    
于 2013-10-10T22:23:05.030 に答える