我有一個簡單的C++結構如下:這個C++結構體的含義是什麼?
// Functor for peak to decreasing intensity sorting
struct cmp_decr_int2
{
bool operator() (peak2 a, peak2 b)
{
return a.int2 > b.int2;
}
};
是有操作者的該樣品中的過載?
我有一個簡單的C++結構如下:這個C++結構體的含義是什麼?
// Functor for peak to decreasing intensity sorting
struct cmp_decr_int2
{
bool operator() (peak2 a, peak2 b)
{
return a.int2 > b.int2;
}
};
是有操作者的該樣品中的過載?
C++中的結構只是具有public而不是private的默認訪問器的類。所以是的,那會有一個功能超載。
是的。 operator()
被稱爲「函數調用」操作符,並允許對象可用,就像它是一個函數一樣。這樣的班級被稱爲「功能員」。
一個常見模式是使函子比較兩個事物的等式或關係,用於需要比較謂詞的任何事物。 (這一個可能是可用在std::map
,例如這將有一個構件等cmp_decr_int2 compare;
然後它可以在兩個事物之間具有比較的關係:if (compare(x, y)) /* x is less than y, by some metric */
)
通過比較它們int2
這種特殊的結構順序2 peak2
的成員。它可以更好地寫爲:
struct cmp_decr_int2
{
// note const! vvvvv
bool operator() (peak2 a, peak2 b) const
{
return a.int2 > b.int2;
}
};
的功能應該是const
,因爲它不需要更改任何成員(有沒有改變。)const
-correctness重要*
在許多情況下,這些仿函數。在參數本身爲const
的上下文中使用,所以您應該按照示例中的值或通過常量引用採用參數。
除了當該類型是基本類型(float,unsigned int,double等)或小於void*
時,您應該更喜歡通過const-reference傳值類型。在大多數情況下,那麼,您將通過常量引用:
struct cmp_decr_int2
{
// note const&: vvvvv v vvvvv v vvvvv
bool operator() (const peak2 & a, const peak2 & b) const
{
return a.int2 > b.int2;
}
};
*如果這是在std::map
用作謂語,例如,沒有const
地圖將無法比較兩個而在const
函數中。
@GMan:謝謝 – ladyfafa 2010-08-13 03:06:25
@Gman:+1,很好的回答。 – 2010-08-13 03:54:26
如果peak2對象不是很小,參數也應該是const引用。 – 2010-08-13 08:01:51
C++中的結構是在這樣一類各種方式,除了默認的參數訪問public:
而非private:
。當定義類型的使用範圍非常狹窄時,比如在一個簡單函子的例子中,使用struct而不是class是一種常見的做法。
這個例子所做的是模擬一個函數指針的外觀,而沒有可能爲空的脆弱性。
operator()
這裏的成員重載函數調用。當您嘗試執行如下操作時:
cmp_decr_int2 foo;
foo(peek2(), peek2());
重載成員被調用。
這對初學者來說非常詳細,真的有幫助! :) – ladyfafa 2010-08-13 03:06:07
#include <iostream>
using namespace std;
struct cmp_decr_int2
{
bool operator() (int a, int b)
{
return a > b;
}
bool operator() (int i)
{
return i > 0;
}
};
int main()
{
cmp_decr_int2 a;
cout << a(1, 2) << endl;
cout << a(1) << endl;
}
是的,肯定可以超載的功能!這對我來說非常合適。
@BT:謝謝!~~~ – ladyfafa 2010-08-13 03:09:58
$ 13.5。4個狀態 -
operator()應該是一個具有任意數量參數的非靜態成員函數。它可以有默認參數。它實現函數調用語法postfix-expression(expression-listopt),其中後綴表達式計算爲一個類對象,可能的空表達式列表匹配該類的operator()成員函數的參數列表。因此,如果存在T :: operator()(T1,T2,T3),則對於類型爲T的類對象x,將調用x(arg1,...)解釋爲x.operator()(arg1,...)並且如果運算符被重載解析機制(13.3.3)選爲最佳匹配函數。
因此,struct'cmp_decr_int2'肯定重載了operator()。
請注意,這也是C++中唯一可以攜帶可變數量參數的運算符。
對不起,我對此表示歉意 – ladyfafa 2010-08-13 02:55:46
感謝編輯:) – ladyfafa 2010-08-13 02:56:03
請注意,在C++中,'struct'只是一個'class',默認的輔助功能是'public'。這個問題不是特定於'struct',也不是答案。 – 2010-08-13 08:03:28