2012-02-29 40 views
1
#include <algorithm> 
#include <functional> 
#include <vector> 

struct blah { 
    int member; 
}; 

int main (int argc, const char* argv[]) 
{ 
    blah a = { 1 }; 
    auto are_same = std::bind(
      std::equal_to<blah>(), 
      a, 
      std::mem_fn(&blah::member) // Obviously not a function, but I tried. 
     ); 

    std::vector<blah> blahs = { {0}, {1}, {2} }; 
    return static_cast<int>(std::any_of(blahs.begin(), blahs.end(), are_same)); 
} 

這個程序編譯失敗(GCC 4.4):測試用的std :: equal_to特定結構的數據成員等

error: no match for call to ‘(std::equal_to<blah>) (blah&, std::_Mem_fn<int blah::*>&)’ 

除了編碼環路自己,有什麼檢查的正確方法基於數據成員的等價性?

+0

你想一般檢查的'blah's平等或者你只是想檢查一個平等的成員?如果前者爲'struct'實現'operator =='。 – 2012-02-29 09:32:15

+0

我正在查看特定數據成員。 – 2012-02-29 12:13:56

回答

4

如果您已經使用C++ 11,爲什麼不使用lambda?

int main (int argc, const char* argv[]) 
{ 
    blah a = { 1 }; 
    auto are_same = [=](blah const& b) -> bool { 
     return a.member == b.member; 
    }; 

    std::vector<blah> blahs = { {0}, {1}, {2} }; 
    return static_cast<int>(std::any_of(blahs.begin(), blahs.end(), are_same)); 
} 

如果您不能使用lambda表達式,可以使用綁定做功能組成:

using namespace std::placeholders; 
auto are_same = std::bind(
    std::equal_to<int>(), 
    std::bind(&blah::member, _1), 
    std::bind(&blah::member, a) 
); 
+0

這當然是正確的。不幸的是,我在短期內瞄準gcc4.4。 – 2012-02-29 12:12:54

+1

@AndresJaanTack添加表單使用綁定組合,它適用於GCC 4.6.1,不知道4.4版,因爲我手頭沒有它。 – Pablo 2012-02-29 17:05:02

+0

似乎那時我還沒有受到我的編譯器的限制。 :( – 2012-03-01 07:11:29

2

除了自己對循環進行編碼之外,根據數據成員檢查等價性的正確方法是什麼?

檢查等效性的正常方法是執行operator==。在你的情況,我想它應該是這樣的:

bool operator==(const blah & lho, const blah & rho) 
{ 
    return (lho.member == rho.member); 
} 
+0

呃,對於60%的情況,這是真的,但是對於生成的代碼和「查找具有此屬性的元素」搜索,如上所述,可悲的是不適用。 – 2012-02-29 12:11:51