2014-02-24 13 views
0

我想知道是否有一個輕量級版本的std :: function只適用於函數指針,但沒有可怕的:)語法像常規函數指針。是否有在iso或boost函數指針,具有相同的語法作爲std :: function

阿卡是這樣的:

int square(int x) 
{ 
return x*x; 
} 
//... 
function_ptr<int (int)> = square; 

OFC綁定和所有其他花哨的東西的std ::功能支持會失敗,但我確定這一說法,如果我需要的std ::功能我會用它。

+0

不是typedef的嗎? – jrok

+0

我不認爲typedefs可讀,這是我的看法,我看過一堆ppl typedefing地圖和東西... – NoSenseEtAl

+0

只是試圖瞭解你的問題。你用'std :: function'的語法是什麼意思?直接使用'std :: function'有什麼問題? – tinlyx

回答

2

你所要求的是一個模板,從簽名等轉換到指向功能簽名,即添加一個指向該類型的指針。已在標準庫完成:

std::add_pointer<X>::type 

但既然你想要什麼更好語法,你可以添加模板別名:

template <typename T> 
using ptr = typename std::add_pointer<T>::type; 

然後,您可以直接使用它你集裝箱:

void f(int); 
std::vector<ptr<void (int)>> v; // vector of pointers to functions taking `int` 
v.push_back(&f); 
+0

這裏是一個簡單的例子,如果脂肪酶感興趣:http://coliru.stacked-crooked.com/a/e00aa0b5833ade9a真的很好的答案,tnx – NoSenseEtAl

2

根據您想使用這個的背景下,它可能是爲auto和/或decltype簡單:

#include <iostream> 
int main() 
{ 
    auto f = square; 
    std::cout << f(5) << std::endl; 

    // define a type 
    using F = decltype(&square); 
    F g = square; 
    std::cout << g(5) << std::endl; 
} 
+0

好吧,如果我想有一個回調向量,我不希望有一個函數簽名的typedef向量,但向量> ...仍尼卡A,+1 – NoSenseEtAl

1

,如果你不希望使用你可以寫一個不透明包裝直接。使用可變參數模板的原型實現如下。同樣的技術可以擴展到其他可調用對象,如lambda表達式。

#include <iostream> 
template<typename T> 
struct function_ptr {}; 

template<class R, class... Args> 
struct function_ptr<R(Args...)>{ 
    typedef R (*funcType)(Args...); 
    function_ptr(funcType f) : _f(f) {} 
    funcType _f; 
    R operator()(Args... args) { return _f(args...);} 
}; 

int square(int x) { 
    return x*x; 
} 

int main() { 
    function_ptr<int (int)> f = square; 
    std::cout << f(2) << std::endl; 
} 
相關問題