0

2 つの関数ポインターと 1 つの値を持つ単純なテンプレート クラスがあります。1 つのポインターは比較演算子であり、もう 1 つはオブジェクト (たとえば、getX()) のポインターです。

ヘッダ:

template<class T>
class A {

public:
    A(T (*function)(), const bool (*op)(T,T),const T value) : 
        function(function), value(value), op(op){}
    bool valid();

private:
    T value;
    T (*function)();
    bool (*op)(T, T);
};

CPP:

#include "A.h"

template<class T>
bool A<T>::valid(){
    return (op(function(),value));
}

したがって、A のインスタンスを作成した場合:

A<float> a = A<float>(x->getX,operator==,20);

valid が呼び出されると、次のようになります。

x->getX() == 20;

実際のヘッダー/クラス定義は正常に機能します。問題は、A のインスタンスを作成するときです。うまくいきません。これは「x->getX」が原因だと思いますが、やりたいことを行う方法はありますか?

ありがとう。

編集::

正確なコンパイラ エラーは次のとおりです。

....\Classes\Objects\B.cpp:42: エラー: 'A::A(未解決のオーバーロードされた関数型、未解決のオーバーロードされた関数型、float)' への呼び出しに一致する関数がありません....\Classes\Objects /Ah:30: 注: 候補は次のとおりです: A::A(T ( )(), const bool ( )(T, T), T) [with T = float] ....\Classes\Objects/Ah: 26: 注: A::A(const A&)

注意: 'x->getX' は float を返します

4

1 に答える 1

0

C++11 を使用できる場合:

あなたが望むことをする方法は、std::bindstd::functionを使うことです。

また、基本型 (int、float ...) の比較演算子を引数として渡したい場合はComparison function objects、< Functional > ヘッダー (std::less、std::greater ...) で定義されたものを使用できます。

#include <functional>
#include <iostream>

template<class T, typename BinaryPredicate>
class A {

public:
    A(std::function<T()> function, BinaryPredicate pred,const T value) : 
        function_(function), pred_(pred), value_(value){}
    bool valid();

private:
    std::function<T()> function_;
    BinaryPredicate    pred_;
    T                  value_;
};

template<class T, typename BinaryPredicate>
bool A<T, BinaryPredicate>::valid(){
    return (pred_(function_(), value_));
}

class X {

   private:
   float val_;

   public:
   X(float val) : val_(val) {}

   float getX() {return val_;}
};

int main(void)
{
   X x(20);

   A<float, std::equal_to<float>> a(std::bind(&X::getX, &x), std::equal_to<float>(), 20);

   std::cout << std::boolalpha << a.valid() << std::endl;

   return (0);
}
于 2013-03-03T04:42:04.510 に答える