2010-10-07 25 views
6

我只是在尋找一組基函數的一個方便的基類,它基於take和int並返回void。unary_function爲什麼不定義operator()?

想用std/functional函子基本上會是unary_function<int,void>operator()

爲什麼virtual result_type operator()(const argument_type& _Left) const = 0;未在unary_function模板上定義?我猜這是因爲可能存在變化的常量...
是否有其他一些模板我錯過了,包括operator()

我有一段時間沒有這樣做,我錯過了什麼?

我怎麼會還利用現有的功能就像

std::ptr_fun< HWND, void >(someFunction); 
std::pointer_to_unary_function<HWND, void>(someFunction); 

編輯: 也許我應該包括使用的另一半,使這個完整。也許這是用法的一半,不符合這個概念。

如何將函子傳遞給方法並使用它?

typedef unary_function<int,void> Functor; 

void DoStuff(const Functor& functor) { 
    int demo = 1; 
    functor(demo); 
} 

functor作爲unary_function沒有定義operator(),所以DoStuff不能編譯。

回答

10

模板概念是duck-typed。在文檔中指定滿足UnaryFunction概念的類需要operator()這一事實在使用模板參數滿足該概念的模板中被指定。沒有必要詳細說明函數簽名,或者要求它是virtual,它需要一個const引用參數,或者它是一個const成員函數。

unary_function模板不應該被認爲是一個接口(它不是被設計爲一個接口)。這當然不是一個多態的基類。它是一個幫手,由希望實施AdaptableUnaryFunction概念的課程使用。

從STL文件,這是可靠的原始設計理念:「它存在的唯一理由是爲了確定適應一元函數更方便」 - http://www.sgi.com/tech/stl/unary_function.html

的標準是類似的:「下面是一些提供簡化的說法typedef和結果類型」(20.3.1/1)

高級用法 - 實際上什麼需要UnaryFunction是,如果f是一元函數對象,並x可轉換爲參數類型,那麼f(x)是結果類型的有效表達式。它根本不需要有一個參數operator(),可以有兩個參數operator(),第二個參數arg具有默認值。嘗試將其定義爲純虛函數;-)

第二個問題,您只需使用函數名稱/指針調用ptr_fun。它的模板參數將從函數類型中推斷出來,所以你不需要指定它們。結果是相應的pointer_to_unary_function模板類型的對象。

要從STL文檔直使用例如:

transform(first, last, first, 
    compose1(negate<double>, ptr_fun(fabs))); 

這大約相當於:

for (auto current = first; current != last; ++current) { 
    *current = -fabs(*current); 
} 

(其中I在其的C++ 0x感使用auto,意思是「我不能被打擾/在這裏寫迭代器類型是不可能的「)

功能名稱/指針可用於transform(需要UnaryFunction模板參數),但不在compose1(需要AdapatableUnaryFunction模板參數)。所以沒有ptr_fun,沒有辦法編寫negatefabs

爲了響應您的編輯,我強調,unary_function不是多態基類。你不能有用地使用它(或它的任何實例)作爲函數參數類型。

如果你想使用UnaryFunction或AdaptableUnaryFunction概念,那麼你必須寫一個函數模板:

template <typename UnaryFunction> 
void DoStuff(UnaryFunction &functor) { 
    int demo = 1; 
    functor(demo); 
} 

這僅要求仿函數取一個類型的int轉換,雖然。它並不要求它完全採用int,而是完全返回void。這通常是一個優點。

如果模板沒有做到你想要的,那麼unary_function不適合你。你沒有錯過任何東西:你可以用虛擬的operator()來設計你自己的界面,但標準庫並不旨在提供任何這樣的東西。

+0

感謝您的詳細信息,以及stl :: transform示例的提醒,這些提示讓我想起使用模板實現虛擬功能。 – 2010-10-08 00:43:33

2

因爲虛擬操作符()不是unary_function概念的一部分。除了常量的不同之外,一元函數概念可以具有非虛擬操作符。

相關問題