2013-08-24 2 views
0

STL로 작업하지만 C++ 0x가 없으며 부스트를 사용할 수 없습니다. 어쨌든 사용시 functor에 2 개 이상의 인수를 바인드 할 수 있는지 궁금합니다. std :: generate? 뭔가 같은2 개 이상의 인수가 포함 된 stl functor

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

using namespace std; 

float f(int x, float y, float z) {return x*(y+z);} 

int main(void) 
{ 
    std:vector<int> v(100); 
    float x=1.2, y=-3.3; 
    generate(v.begin(), v.end(), bind3argu(f, _, x, y)); // something like this: '_' is from vector 

    // as suggested, I also try 
    generate(v.begin(), v.end(), std::bind(f, x, y)); 
    return 0; 
} 

나는 std :: bind를 사용하려고 시도하지만 g ++ 4.4.6에서는 컴파일되지 않습니다. BTW, std :: bind C++ 0x 및/또는 C++ 11에서만 지원됩니까?

+0

'main'은'int' 리턴 타입을 가져야합니다. – chris

+0

벡터에서 오는 '_'부분은 무엇입니까? 벡터 요소에 포함될 수있는 초기 값입니까? – Mahesh

+0

안녕하세요, Mahesh, 내가 게시 한 코드가 존재하지 않습니다. 구현하고 싶은 아이디어를 보여주고 싶습니다. _는 벡터의 요소를 나타냅니다. – user1285419

답변

0

펑터를 사용하려는 경우 std::transform을 사용해보십시오.

float foo(float z) { 
    float x=1.2, y=-3.3; 
    return x*(y+z); 
} 

std::transform(v.begin(), v.end(), v.begin(), foo); 

벡터 값도 전달하는 실제 문제. 케이스가 아니라면 std::bind이 유용 할 것입니다.

std::generate(v.begin(), v.end(), std::bind(f, x, y /*Any number of varaibales*/)); 
+0

thx하지만 x와 y가 상수 변수 인 경우 (즉, 수시로 변경 될 수 있으며 인수로 제공해야하는 경우) – user1285419

+0

업데이트를 확인하십시오. 벡터 요소의 초기 값을 사용하지 않는 한'std :: bind'를 사용할 수 있습니다. – Mahesh

+0

감사. 나는 표준에서 사용하려고 : : 질문에 업데이트 된 코드로 바인딩합니다. 그러나 컴파일되지 않습니다. 내가 놓친 게 있니? 감사합니다 – user1285419

0

당신이 원하는대로 무엇이든 할 수있는 확실히 자신의 작성기를 작성할 수 있습니다.

예를 들어 :

struct Three { 
    Three (float &x, float &y) : x_(x), y_(y) {} 
    float operator (float z) const { /* do something with x_,y_ and z */ } 
private: 
    float &x_; 
    float &y_; 
}; 

을 (테스트되지 않은 코드는 참조 대신 포인터를해야 할 수도 있습니다) 그리고 당신은 말할 수 : bind1st의

float x=1.2, y=-3.3; 
Three three (x, y); 
generate(v.begin(), v.end(), three); 

장점, 또는 부스트 : : 바인딩, 또는 C++ 11 람다는 구조 정의의 모든 스캐 폴딩을 사용하지 않고 원하는 코드 만 작성할 수 있다는 것입니다.