2013-07-14 16 views
10

我想引用內置運算符的函數指針,但我不知道如何指定特定的類型重載。是否可以獲取內置標準運算符的函數指針?

我有以下的模板類簽名:

template<typename ParamsType, typename FnCompareType> 
class MyAction 
{ 
public: 
    MyAction(ParamsType& arg0, ParamsType& arg1, FnCompareType& fnCpmpare) 
    : arg0_(arg0), arg1_(arg1), fnCompare_(fnCpmpare) {} 

    bool operator()() 
    { 
     if((*fnCompare_)(arg0_,arg1_) 
     { 
      // do this 
     } 
     else 
     { 
      // do s.th. else 
     } 
    } 

private: 
    ParamsType& arg0_; 
    ParamsType& arg1_; 
    FnCompareType& fnCompare_; 
} 

,並希望使用這樣的語法:

void doConditional(int param1, int param2) 
{ 
    MyAction<int,&::operator>=> action(param1,param2); 
    if(action()) 
    { 
     // Do this 
    } 
    else 
    { 
     // Do that 
    } 
} 

但是,這並不編譯:

error: ‘::operator>=’ has not been declared 

什麼我可以參考這種內在的靜態操作嗎?

+0

'ACTION_P1(MyAction,fnCompare){...}'難道這甚至編譯?返回類型和參數的類型在哪裏? –

+0

@MonadNewb是的,它的確如此!真正的定義更加複雜。 [tag:googlemock]通過模板參數列表推遲操作參數的類型。 –

+0

感謝您刪除googlemock的詳細信息,以使您的問題更加清晰。對於未來的參考,當你做這樣的簡化讓你的問題的核心問題,您應該與純醇」 C++編譯,這樣其他人可以複製並粘貼代碼,並將其編譯爲-就是一個例子。 –

回答

17

內置運營商

爲什麼你不能讓他們的函數指針:

C++ 11,§13.6/ 1,[over.built]

候選人運營商表示在第5章中定義的內置運算符的函數在本子條款中指定。這些候選功能參與運營商重載決議過程中描述的13.3.1.2 和沒有其他用途

內置運營商(那些內置的類型)是不是真正的操作功能。所以你不能有指向它們的函數指針。您也無法使用operator<(A,B)語法來調用它們。 他們只參與重載解析,但編譯器會直接將它們轉換成適當的asm/machine指令,而不需要任何「函數調用」。

來解決這個問題的方法:

user1034749 has already answered這個問題,但出於完整性:

該標準定義了很多函數對象的§20.8,[function.objects],即

  • 算術運算
  • 比較
  • 邏輯運算
  • 位運算

函數對象是一個功能對象類型的對象。在期望將函數指針傳遞給算法模板的地方(第25章),接口被指定爲接受函數對象。這不僅使算法模板能夠處理指向函數的指針,還能使它們使用任意函數對象。

C++ 11,§20.8.5,[比較]

  • equal_to
  • not_equal_to
  • 更大,更少
  • greater_equal
  • less_equal

那些是模板函數對象,其衰減到類似的操作者在其operator()功能。它們可以用作函數指針參數。

user1034749是對的,我想陳述一下:沒有其他辦法,這些在使用上與'原始'函數指針完全等價。給出的參考。

標準類型算

可以使用標準庫運營商爲函數指針(其存在作爲「真正的功能」)。

但你必須參考模板的相應實例。編譯器將需要適當的提示來推斷正確的模板。

這對我的作品在2012年的MSVC使用的std::basic_string

template<class Test> 
Test test_function (Test const &a, Test const &b, Test (*FPtr)(Test const &, Test const &)) 
{ 
    return FPtr(a, b); 
} 

int main(int argc, char* argv[]) 
{ 
    typedef std::char_traits<char> traits_t; 
    typedef std::allocator<char> alloc_t; 
    std::basic_string<char, traits_t, alloc_t> a("test"), b("test2"); 
    std::cout << test_function<std::basic_string<char, traits_t, alloc_t>>(a, b, &std::operator+) << std::endl; 
    return 0; 
} 

operator+如果test_function模板參數被冷落推斷這將失敗(至少在2012 MSVC)。

+0

這看起來很像這個問題的典型答案! –

8

您可以使用相同的解決方案,在C++標準庫使用:

std::sort (numbers, numbers+5, std::greater<int>()); 

,其中較大的是

template <class T> struct greater : binary_function <T,T,bool> { 
    bool operator() (const T& x, const T& y) const {return x>y;} 
}; 
你的情況

http://www.cplusplus.com/reference/functional/greater_equal/

關於建立操作的參考。

您可以參考現有的運營商<的任何類(當然,如果他們不是私人的,受保護的或您的課程/功能不是朋友)。 但內建類型(bool,short,int,double)的操作符<不可能引用。 事件如果不看C++標準,你可以從我上面的文本中看到。

+0

THX!已經找到了如何使用這個。對不起,我已經編輯了我的問題以獲得一個通用答案,如果它在某種程度上可以引用這些操作符函數。 –

+0

@ g-makulik標準庫提供了包含大部分內置運算符的命名函數。 –

+0

@MonadNewb是的,我知道!說... –