1 분 소요

개요

  • 정수, 부동 소수점 혹은 포인터 a와 b의 중간점을 반환
  • 오버로드가 발생하지 않음
    • (a+b)/2 대신 a+(b-a)/2를 사용해도 오버로드가 발생하지 않음
  • a와 b가 정수 유형일 경우 합이 홀수인 경우 a쪽으로 반올림
  • a와 b가 부동 소수점일 경우 합이 홀수인 경우 최대 하나의 부정확한 연산 발생
  • a와 b가 포인터(a = x[i], b = x[j])일 경우 x[midpoint(i, j)]에 대한 포인터 반환


예제

  • 코드
    #include <algorithm>
    #include <iostream>
    #include <limits>
    #include <numeric>
    #include <vector>

    using namespace std;

    int main() {
    	auto func = [](auto x, auto y) {
    		if constexpr (is_pointer<decltype(x)>::value) {
    			cout << "x : " << *x << ", y : " << *y << endl;
    			cout << "midpoint : " << *midpoint(x, y) << endl << endl;
    		} else {
    			cout << "x : " << x << ", y : " << y << endl;
    			cout << "midpoint : " << midpoint(x, y) << endl << endl;
    		}
    	};

    	func(1, 3);
    	func(1, 6);
    	func(numeric_limits<int>::max() - 2, numeric_limits<int>::max());

    	vector<int> v = {1, 2, 3};
    	func(v.data(), v.data() + v.size() - 1);

    	return 0;
    }
  • 실행 결과
    x : 1, y : 3
    midpoint : 2

    x : 1, y : 6
    midpoint : 3

    x : 2147483645, y : 2147483647
    midpoint : 2147483646

    x : 1, y : 3
    midpoint : 2