C++ - 함수 템플릿 포인터를 함수에서 파라미터로 받기
함수 템플릿의 포인터를 함수에 넘기는 경우
template<typename T, typename Func>
T
calc(T a, T b, Func func){
return func(a, b);
}
template<typename T>
T
plus(T a, T b){
return a + b;
}
assert(calc(1, 2, &plus<int>) == 3, ""); // ok
assert(calc(1, 2, &plus) == 3, ""); // error
위처럼 호출 측에서 명시적으로 타입을 정의하고 넘겨야 하지만, 받는 측에서 함수 포인터를 정의해 두면 문제 없이 넘길 수 있다.
// 템플릿의 기본 값에 함수 포인터 타입을 정의
template<typename T, typename Func = T(*)(T, T)>
constexpr T
calc(T a, T b, Func func){
return func(a, b);
}
template<typename T>
constexpr T
plus(T a, T b){
return a + b;
}
struct minus{
template<typename T>
constexpr T
operator ()(T a, T b) const{
return a - b;
}
};
int
main(){
static_assert(plus(1, 2) == 3, "");
static_assert(calc(1, 2, &plus<int>) == 3, "");
static_assert(calc(1, 2, &plus) == 3, "");
static_assert(calc(1, 2, minus{}) == -1, ""); // ok
return 0;
}
이 글은 2020-06-16에 작성되었습니다.