functional_bind12

functional_bind12 (bind1st와 bind2nd 바인딩 함수)

이 페이지는 C++ 표준 라이브러리의 bind1stbind2nd 함수 템플릿에 대해 설명해요. 이 함수들은 주어진 이항 함수 객체의 첫 번째 또는 두 번째 인자에 특정 값을 고정한 새 함수 객체를 만들어요. C++11에서 deprecated 되었고 C++17에서 제거되었지만, 오래된 코드를 읽거나 유지보수할 때 유용해요.

출처: cppreference

본문

정의

<functional> 헤더에 다음과 같이 정의되어 있어요.

Defined in header <functional>
template < class F , class T > std :: binder1st < F > bind1st ( const F & f , const T & x ); (1) (deprecated in C++11) (removed in C++17)
template < class F , class T > std :: binder2nd < F > bind2nd ( const F & f , const T & x ); (2) (deprecated in C++11) (removed in C++17)

주어진 이항 함수 객체 f의 첫 번째 또는 두 번째 매개변수에 인자 x를 바인딩해요. 즉, 결과로 만들어지는 래퍼 안에 x를 저장해 두고, 호출 시 xf의 첫 번째 또는 두 번째 인자로 전달해요.

매개변수

이름 설명
f 인자를 바인딩할 함수 객체 (함수 포인터)
x f에 바인딩할 인자

반환값

fx를 감싸는 함수 객체를 반환해요.

예외

구현에서 정의하는 예외를 던질 수 있어요.

예제

다음 예제는 bind1st를 사용해 각도를 라디안으로 변환하는 함수 객체를 만들어요.

#include <algorithm>
#include <cmath>
#include <cstddef>
#include <functional>
#include <iomanip>
#include <iostream>
#include <vector>

int main()
{
    std::vector<double> a = {0, 30, 45, 60, 90, 180};
    std::vector<double> r(a.size());
    const double pi = std::acos(-1); // since C++20 use std::numbers::pi

    std::transform(a.begin(), a.end(), r.begin(),
        std::bind1st(std::multiplies<double>(), pi / 180.0));
//  an equivalent lambda is: [pi](double a) { return a * pi / 180.0; });

    for (std::size_t n = 0; n < a.size(); ++n)
        std::cout << std::setw(3) << a[n] << "° = " << std::fixed << r[n]
                  << " rad\n" << std::defaultfloat;
}

출력은 다음과 같아요.

  0° = 0.000000 rad
 30° = 0.523599 rad
 45° = 0.785398 rad
 60° = 1.047198 rad
 90° = 1.570796 rad
180° = 3.141593 rad

관련 항목

  • binder1st, binder2nd — 이항 함수와 그 인자 중 하나를 보관하는 함수 객체 (클래스 템플릿, C++11에서 deprecated, C++17에서 제거)
  • bind_front, bind_back — 함수 객체에 여러 인자를 순서대로 바인딩하는 함수 템플릿 (C++20, C++23)

더 알아보기 (Learn more)