2016-04-08 96 views
4

here在我看來,std::function沒有function_type或等效的成員類型來導出用於初始化它的實際類型。
它有result_type,argument_type,以及first_argument_typesecond_argument_type,但沒有像上面提到的類型。
爲什麼它不提供這種類型作爲其接口的一部分?
肯定會有一個很好的理由,但我無法弄清楚是什麼原因,所以我只是好奇地發現它。爲什麼std :: function沒有function_type或等效的成員類型?


因爲我知道第一個問題將是你爲什麼需要它,好了,以爲我想這樣做std::is_same<F1::function_type, F2::function_type>::value檢查,如果它們的基礎類型是一個SFINAE評價,它是相同的如果它們包含不同的功能,只要符號相同即可。
我承認這沒什麼道理,說實話這個問題只是爲了好奇。

編輯

如在his answer的評論注意到@布賴恩,我濫用初始化當我寫的詞:

出口用於初始化它

的實際類型

我感興趣的是模板參數。
作爲示例,對於std::function<void(S&, int)>(其中S是結構),function_type將是void(S&, int)

+1

對於'is_same'檢查,您可以簡單地檢查'F1'和'F2'是否是相同的類型,不是嗎? – Brian

+0

@布賴恩是的,絕對,請注意我的評論*我承認它沒有多大意義*! :-) ...我只是想知道是否有一個原因,它不是該函數的接口的一部分,即使我找不到它的合理用途,這將是一個很好的反應確實。我不確定*這是無用的*是唯一合理的迴應,或者是否有其他原因。就這樣。 – skypjack

回答

6

我認爲你問的是錯誤的問題。正確的問題是:爲什麼應該有這樣的成員類型?

比如說,如果你寫一個函數模板可以接受的std::function的任何專業,那麼模板參數將已經立即提供給您:

template <typename T> 
void f(std::function<T> F) { 
    // you wouldn't write decltype(F)::function_type here; you'd just write T 
} 

更不方便的情況是一個在其中有像

template <typename Callable> 
void f(Callable C); 

這裏的一些功能,你都難保Callablestd::function專業化,這樣即使std::function<T>typedef T function_type,喲你不想訪問Callable::function_type任意可調用。所以這裏不會有任何用處。

正確的問題是:爲什麼一些標準庫類會暴露它們的模板參數,例如容器爲T(其中有typedef T value_type)?答案是標準有一組特定的要求,容器類型必須滿足,這反映了一個設計目標,應該有可能編寫適用於不同類型容器的通用算法,而不是所有這些都是模板專業化形式爲C<T>。然後強制所有容器都暴露value_type是有意義的,因爲這是從任意容器中提取元素類型的唯一統一方法。

如果std::function也有一些Callable概念的一個實例,它將使意義有要求,有一個function_type的typedef使代碼接受任何Callable可以訪問函數類型。但情況並非如此,只有單個模板std::function纔有用。

3

你可以隨便寫一個:

template < typename T > 
struct function_type; 

template < typename Sig > 
struct function_type<std::function<Sig>> { using type = Sig; }; 

在您的術語:實例化是你要找的字。您正在尋找模板爲的實例化的類型

唯一知道爲什麼不是會員類型的人是那些設計此功能的人以及那些在(可能)投票的人。它可能只是沒有人想到的東西。這似乎有點顯而易見,但是從想要它的角度來看,這是事後的看法。

相關問題