728x90
반응형
function을 구성할 때 운용하기 쉽도록 하기 위해 bind를 이용하여 매개변수를 미리 넣어둘 수 있다. 하지만 이 방향은 하나의 패키지처럼 묶기기 때문인지 변수의 메모리 주소가 변경되었다.
아래와 같이 간단히 테스트해보면 bind로 묶은 변수 b와 실제 함수에 적용되는 b의 주소 값이 다르다. 결과도 적용되지 않는다.
#include <iostream>
#include <functional>
using namespace std;
void add(int a, int& b)
{
b = a * a;
cout << "b address : " << &b << endl;
}
int main()
{
std::function<void(int, int&)> func = add;
int a = 10;
int b = 1;
auto newFunc = std::bind(func, a, b);
cout << "b address : " << &b << endl;
newFunc();
cout << "b result : " << b << endl;
return 0;
}
b의 주소가 다를 뿐 아니라 결과 값도 변경되지 않았다. 이것은 변수를 참조자(&)를 사용했기 때문이다.
내부적으로 어떤 처리를 하는지 확인할 수 없지만 해당 부분을 포인트로 변경하면 제대로 동작한다.
#include <iostream>
#include <functional>
using namespace std;
void add(int a, int* b)
{
*b = a * a;
cout << "b address : " << b << endl;
}
int main()
{
std::function<void(int, int*)> func = add;
int a = 10;
int b = 1;
auto newFunc = std::bind(func, a, &b);
cout << "b address : " << &b << endl;
newFunc();
cout << "b result : " << b << endl;
return 0;
}
포인트를 줄이고 참조자를 많이 이용하려고 했던 습관이 이런 결과를 가져올지 몰랐다.
bind한 변수를 참조자를 이용하여 컨트롤하려고 했는데 되지 않았다면, 포인터를 이용하면 해결할 수 있다.
728x90
반응형
'Program Language > C & C++' 카테고리의 다른 글
[VS] Visual Studio Dependencies(종속성) 설정 (0) | 2021.12.06 |
---|---|
[C++] namespace 사용 시 LNK2019 에러 발생 (0) | 2021.12.06 |
[C++] wsprintf → swprintf_s (float 문제 해결) (0) | 2021.11.16 |
[C++] 변수 묶어 사용하기 (pair, tuple) (0) | 2021.11.15 |
[C++] file in/out (0) | 2021.11.08 |