2013-03-02 107 views
0

我有一個簡單的模板類,它有兩個函數指針和一個值。一個指針是比較運算符,另一個是對象(例如getX())。實例對象的C++函數指針

頁眉:

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<float> a = A<float>(x->getX,operator==,20); 

當有效的被稱爲是將相當於:

x->getX() == 20; 

實際的頭文件/類定義正常工作。問題在於創建A的實例;它不起作用。我認爲這是因爲'x-> getX',但有沒有辦法做我想要的?

謝謝。

EDIT ::

確切編譯器錯誤是:

.... \類\對象\ B.cpp:42:錯誤:對呼叫至「A ::沒有匹配函數A(無法解析的重載函數類型,無法解析的重載函數類型,float)' .... \ Classes \ Objects/Ah:30:note:candidates are:A :: A(T()(),const bool( )(T,T),T)[with T = float] .... \ Classes \ Objects/Ah:26:note:A :: A(const A &)

請注意: 'X->的getX' 返回一個float

+0

「不行」是什麼意思? – 2013-03-02 20:32:59

+0

函數指針不是函子。函子是一個重載'operator()'的類。 – 2013-03-02 20:34:20

+0

更改爲函數指針。通過「不起作用」,我的意思是在創建A的實例時它不會編譯。 – aoi 2013-03-02 20:35:54

回答

0

如果你可以使用C++ 11:

的方式做你想做的就是用std::bindstd::function。您可以使用在>functional>標頭(std :: less,std :: greater)中定義的Comparison function objects作爲參數比較運算符。如果您想傳遞基本類型(int,float ...)的參數比較運算符,則可以使用Comparison function objects>functional> ..)

#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); 
}