- (C++11~) 기존에 제공되던 함수자 타입 특성 클래스(unary_function, binary_function등), 바인더(bind1st(), bind2nd()등), 어뎁터와 부정자(mem_fun(), mem_fun_ref(), ptr_fun(), not1(), not2(), unary_negate(), binary_negate(), pointer_to_unary_function(), pointer_to_binary_function() 등)가 람다 표현식, function, bind(), mem_fn()등으로 대체되어 deprecate 되었습니다.
- (C++11~) function이 추가되어
()
로 호출 가능한 함수자를 저장할 수 있습니다.
- (C++11~) mem_fn()이 추가되었습니다. 인자가 있는 멤버 함수도 호출하는 함수자를 좀 더 간편하게 만들어 줍니다.
- (C++11~) reference_wrapper가 추가되어 복사 생성이나 복사 대입이 안되는 참조자를 래핑할 수 있습니다.
- (C++11~) ref(), cref()가 추가되어 reference_wrapper 개체를 좀더 간편하게 생성할 수 있습니다.
- (C++11~) bind()가 추가되어
placeholders::_1
(GCC의 경우 _1
, _2
, _3
, … _29
가 정의됨)와 같은 자리 표시자와 조합하여 특정 인자만을 사용하는 함수자를 생성할 수 있습니다.
- (C++11~) is_bind_expression가 추가되어 bind()로 생성한 함수인지 검사할 수 있습니다.
- (C++11~) is_placeholder가 추가되어 자리 표시자를 사용했는지 검사할 수 있습니다.
- (C++14~) bit_not이 추가되었습니다.
- (C++17~) 문자열 검색기(
default_searcher
, boyer_moore_searcher
, boyer_moore_horspool_searcher
)가 추가되어 search()의 함수자로 사용할 수 있습니다.
- (C++17~) not_fn()이 추가되었습니다. 인자(단항, 이항 제한이 없습니다.)로 전달한 함수자를 부정하는 함수자를 만듭니다.
- (C++17~) invoke()가 추가되어 일반 함수와 멤버 함수를 동일한 방식으로 호출할 수 있습니다.
- (C++20~) invoke_r()이 추가되었습니다.
- (C++20~) unwrap_reference, unwrap_ref_decay가 추가되었습니다.
- (C++20~) identity가 추가되었습니다.
개요
C++11 부터 기존에 제공되던 함수자 타입 특성 클래스(unary_function, binary_function등), 바인더(bind1st(), bind2nd()등), 어뎁터와 부정자(mem_fun(), mem_fun_ref(), ptr_fun(), not1(), not2(), unary_negate(), binary_negate(), pointer_to_unary_function(), pointer_to_binary_function() 등)가 람다 표현식, function, bind(), mem_fn()등으로 대체되어 deprecate 되었습니다.
함수자 타입 특성 클래스
함수자
항목 |
내용 |
equal_to |
arg1 == arg2 |
not_equal_to |
arg1 != arg2 |
greater |
arg1 > arg2 |
less |
arg1 < arg2 |
greater_equal |
arg1 >= arg2 |
less_equal |
arg1 <= arg2 |
logical_and |
arg1 == arg2 |
logical_or |
arg1 || arg2 |
logical_not |
!arg |
plus |
arg1 + arg2 |
minus |
arg1 - arg2 |
multiplies |
arg1 * arg2 |
divides |
arg1 / arg2 |
modulus |
arg1 % arg2 |
negate |
-arg |
bit_and |
arg1 & arg2 |
bit_or |
arg1 | arg2 |
bit_xor |
arg1 ^ arg2 |
bit_not (C++14~) |
~arg |
부정자
항목 |
내용 |
unary_negate (~C++11) |
(작성중) |
binary_negate (~C++11) |
(작성중) |
not1() (~C++11) |
단항 조건자의 리턴값을 부정합니다. |
not2() (~C++11) |
이항 조건자의 리턴값을 부정합니다. |
not_fn() (C++17~) |
인자(단항, 이항 제한이 없습니다.)로 전달한 함수자를 부정하는 함수자를 만듭니다. |
1
2
3
| // IsSame을 부정하는 함수자를 만듭니다.
auto IsDifferent{std::not_fn(IsSame)};
EXPECT_TRUE(IsDifferent(1, 1, 1) == false); // 인자가 여러개여도 됩니다.
|
바인더
항목 |
내용 |
bind1st(op, x) (~C++11)
binder1st() (~C++11) |
알고리즘엔 단항 함수로 전달되며, op(x, 요소) 로 이항 함수를 호출합니다. |
bind2nd(op, y) (~C++11)
binder2nd() (~C++11) |
알고리즘엔 단항 함수로 전달되며, op(요소, y) 로 이항 함수를 호출합니다. |
bind() (C++11~) |
placeholders::_1 (GCC의 경우 _1 , _2 , _3 , … _29 가 정의됨)와 같은 자리 표시자와 조합하여 특정 인자만을 사용하는 함수자를 생성합니다. |
is_bind_expression (C++11~) |
bind()로 생성한 함수인지 검사합니다. |
is_placeholder (C++11~) |
자리 표시자를 사용했는지 검사합니다. |
_1, _2, _3, _4 (C++11~) |
자리 표시자 입니다. |
bind_front() (C++20~) |
bind()처럼 함수자를 생성합니다. 인자들을 순서대로 배치하므로, 인자의 순서 변경이 없다면 간편하게 사용할 수 있습니다. |
bind_back() (C++23~) |
(작성중) |
함수 래퍼
항목 |
내용 |
function (C++11~) |
() 로 호출 가능한 함수자를 저장합니다. |
bad_function_call (C++11~) |
function에서 () 로 호출할 대상이 없을 때 bad_function_call 예외를 방출합니다. |
mem_fun() (~C++11)
mem_fun_t (~C++11)
mem_fun1_t (~C++11)
const_mem_fun_t (~C++11)
const_mem_fun1_t (~C++11) |
알고리즘에서 f(x) 의 호출을 x->f() 처럼 호출되게 합니다. |
mem_fun_ref() (~C++11)
mem_fun_ref_t (~C++11)
mem_fun1_ref_t (~C++11)
const_mem_fun_ref_t (~C++11)
const_mem_fun1_ref_t (~C++11) |
알고리즘에서 f(x) 의 호출을 x.f() 처럼 호출되게 합니다. |
ptr_fun() (~C++11) |
바인더, 어뎁터, 부정자와 일반 함수가 호환될 수 있도록 일반 함수를 unary_function 이나 binary_function 개체로 만듭니다. |
pointer_to_unary_function (~C++11) |
(작성중) |
pointer_to_binary_function (~C++11) |
(작성중) |
mem_fn() (C++11~) |
인자가 있는 멤버 함수도 호출하는 함수자를 만들어 줍니다. |
invoke(Func, params…) (C++17~) |
invoke()가 추가되어 일반 함수와 멤멤버 함수를 동일한 방식으로 호출할 수 있게 합니다. 일반 함수인 경우 Func(params...) 를 호출하고, 멤버 함수인 경우 params[1].Func(params[2]...) 을 호출합니다. |
invoke_r() (C++20~) |
(작성중) |
move_only_function (C++23~) |
(작성중) |
copyable_function (C++26~) |
(작성중) |
function_ref (C++26~) |
(작성중) |
(C++11~) 참조 래퍼
(C++17~) Searcher
C++17 부터는 문자열 검색기가 추가되어 search()의 함수자로 사용할 수 있습니다.
다음은 data
문자열에서 sub
를 찾는 예입니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| std::string data{"Hello world."};
std::string sub{"wo"};
auto itr = std::search(
data.begin(),
data.end(),
std::default_searcher(
sub.begin(),
sub.end()
)
);
// data에서 sub를 찾았다면 오프셋을 구해봅니다.
if (itr != data.end()) {
EXPECT_TRUE(std::distance(data.begin(), itr) == 6);
}
|
(C++20~) Identity
항목 |
내용 |
identity (C++20~) |
(작성중) |
댓글남기기