2012-02-01 62 views
2

比方說,我有以下功能:不綁定的值,而是一個功能(這個功能獲得價值)

int foo (int a) 
{ 
    return something; 
} 

我怎麼可以做這樣的事情?

vector<int> v; 

std::for_each(v.begin(), v.end(), std::bind1st(std::minus<int>(), foo)); 

我想這個工作,如:for_each通過當前元素到仿,仿函數調用foo,然後減去通過向量元素,並呼籲foo的結果。是否有可能使用std而不是boost或自寫functor?

+1

1)你想在哪裏存儲減法結果?修改矢量或創建另一個? 2)執行'foo'函數返回參數值,那麼減去它自身的值有什麼意義(總是返回零)? – 2012-02-01 11:58:07

+0

1)讓我說我不想修改原始矢量2)如果我有另一個功能呢? – fogbit 2012-02-01 12:33:34

回答

2

嗯,這是稍微可怕的,但在C++ 11 ...

#include <vector> 
#include <functional> 
#include <algorithm> 

int foo(int a) 
{ 
    return a; 
} 

int operator-(int b, std::function<int(int)> a) 
{ 
    return b - a(b); 
} 

int main() 
{ 
    std::vector<int> v = {1,2,3,4,5}; 
    std::for_each(v.begin(), v.end(), std::bind((int(*)(int, std::function<int(int)>))(&operator-), std::placeholders::_1, &foo)); 
    return 0; 
} 

少可怕使用方法lambda表達式

std::for_each(v.begin(), v.end(), [](int a) -> int { return a - foo(a); }); 
+1

如果你打算使用C++ 11,那麼只需寫一個lambda。 – 2012-02-01 12:41:08

+0

嗯,他似乎對綁定部分更感興趣......我將以lambda示例編輯 – Zharf 2012-02-01 12:51:53

+0

嗯,你真的認爲第一個變體代碼(沒有lambdas)是可維護的嗎? =) – 2012-02-01 19:47:53

0

如果你不想修改矢量,所以我會假設你想將它轉換爲另一個。

#include <algorithm> 
#include <iterator> 
#include <vector> 

int foo(int a) 
{ 
    return a; 
} 

int foo2(int a) 
{ 
    return a - foo(a); 
} 

int main() 
{ 
    std::vector<int> v; 

    v.push_back(10); 
    v.push_back(20); 
    v.push_back(30); 

    std::vector<int> v2; 
    std::transform(v.begin(), v.end(), std::back_inserter(v2), foo2); 

    return 0; 
}