1

関数をパラメーターの 1 つとして受け取り、それをメンバー変数に格納する必要があるクラスの .hpp ファイルを作成しています。これまでのところ、私のコードは次のようになります。

template<typename Function> class myClass
{
  public:
           myClass(Function function) : pvFunction( function ) {}

           //Functor operator
           double operator() (double x) const{
             return pvFunction(x+4);
           }
  private:
           Function pvFunction
}

プログラムが無意味に見えるのは、プログラムが返す値が今のところ重要ではないからです。このクラスに関数を渡し、そのファンクター演算子を使用する方法を理解しようとしているだけです。唯一の問題は次のとおりです。

1) このクラス定義が正しいかどうかはわかりません。つまり、これは、このクラスのオブジェクトにパラメーターとして渡される任意のタイプの関数を受け入れる適切な方法です。

2) プログラムでこのクラスのインスタンスを作成するにはどうすればよいですか? 関数を新しいオブジェクトに渡して呼び出すにはどうすればよいですか?

かなり長い間これに取り組んでいて、それを理解できないようです

編集:

私のプログラム ファイル main.cpp では、次のコードでエラーが発生します。

double function(double);

int main()
{
   myClass<double> myClassObject((function));
   return 0;
}

double function(double x)
{
   return (x+3.0);
}
4

4 に答える 4

4

クラスはテンプレート パラメーターが実際の関数型であると想定しているため、エラーが発生しますがdouble、インスタンス化のようにテンプレート パラメーターを渡します。

のような C++11 の新しい機能を使用することを検討してくださいstd::function

template<typename T>
struct myClass
{
    typedef std::function<T(T)> func_type;

    func_type pvFunction;

    myClass(func_type func) : pvFunction(func) {}

    T operator()(T x)
        { return pvFunction(x + 4); }
};

double function(double x)
{
    return (x+3.0);
}

int main()
{
    myClass<double> my_class(function);
    std::cout << "my_class(3) = " << my_class(3) << '\n';
}
于 2012-10-11T08:35:14.977 に答える
1

1) そうです。

myClassObject2)あなたの例のタイプは

 myClass<double(*)(double)> myClassObject(function);

function は type であるためdouble(*)(double)。このようなテンプレートのオブジェクトを構築する最良の方法は、次のような関数テンプレートを使用することです。

template<typename Function>
myClass<Function> MakeMyClass(Function f)
{
    return myClass<Function>(f);
}


int main()
{
   auto withFuncPtr= MakeMyClass(function);
   auto withLambda= MakeMyClass([] (double v) {return v*2;});

   Foo foo;
   auto withStdFunction = MakeMyClass(
       std::bind(&Foo::Method, &foo, std::placeholders::_1));
   return 0;
}
于 2012-10-11T08:37:46.757 に答える
0

提案として operator() で struct を使用できます

template<typename Function> class myClass
{
  public:
        myClass(){}

        //Functor operator
        double operator() (double x) const
        {
          return pvFunction(x+4);
        }
  private:
        Function pvFunction;
};

struct Double
{
    double operator()(const double n)const
    {
        return n;
    }
};

int main() {
    myClass<Double> myClassObject;
    std::cout<<myClassObject(2.0f);
    return 0;
}

プリント 6

于 2012-10-11T08:39:27.443 に答える
0

double の引数型を持つようにバインドしたい場合、関数をどのように使用できるので、何を達成したいのか本当にわかりませんが、以下の例ではサンプルテンプレートが機能しますが、実際には機能しません。 t 使用を参照してください。

    template<typename Function> class myClass
    {
    public:
        myClass(Function function) : pvFunction( function ) {}

        //Functor operator
        double operator() (double x) const{
            return pvFunction(x+4);
        }
    private:
        Function pvFunction;
    };

    double foo1(double x)
    {
        return x;
    }

    double foo2(double x)
    {
        return x + 1;
    }
    int main(int argc, char** argv)
    {
        myClass<double(*)(double)> instance1(foo1);
        myClass<double(*)(double)> instance2(foo2);
        double a = instance1(1.5), b = instance2(1.5);
        return 0;
    }
于 2012-10-11T08:39:49.590 に答える