2014-12-10 1 views
2

함수의 여러 계층을 통해 포인터를 전달해야하는 일부 코드에 문제가 있습니다. 포인터는 null이 될 수 있으므로 nullptr의 경우 최종 함수에 오버로드가 발생했습니다. testtest_ptr의 첫 번째 버전을 호출하지만이 경우가 아니라면,C++ 여러 함수를 통해 nullptr 전달

void test_ptr(std::nullptr_t) 
{ 
    std::cout << "nullptr" << std::endl; 
} 
void test_ptr(double *d) 
{ 
    std::cout << *d << std::endl; 
} 

void test(double *d) 
{ 
    test_ptr(d); 
} 

int main() 
{ 
    test(nullptr); 
} 

나를 위해, 이상적인 행동은 다음과 같습니다 개념 나는 이런 일을했습니다. test을 조작하여 "올바른"버전을 호출 할 수 있습니까?

답변

1

double* 기능 시작 부분에서 nullptr을 확인하지 않는 이유는 무엇입니까?

귀하의 경우에는 nullptr_t의 기능을 과부하 할 필요가 없습니다. std::nullptr_t의 사용은이 질문에 설명되어 있습니다 : What are the uses of the type `std::nullptr_t`?

그래서이 당신을 위해 의미 : 당신이 포인터 타입을 받아 다른 test_ptr 기능을 가지고 있다면, 당신은 std::nullptr_t와 오버로드를해야합니다. 그러나 단 하나의 test_ptr 기능만으로는 필요하지 않습니다.

+0

당연히 과부하는 필요하지 않지만 나는 개인적으로 두 가지 다른 과부하로 표시해야 할 경우를 구분해야합니다. 그런 식으로 작동하지 않으면 제안대로 구현할 것입니다. – Mazzi

5

당신은 함수 템플릿이 필요합니다 : 코드에서

void test_ptr(std::nullptr_t) 
{ 
    std::cout << "nullptr" << std::endl; 
} 
void test_ptr(double *d) 
{ 
    std::cout << *d << std::endl; 
} 

template<typename T> 
void test(T d) 
{ 
    test_ptr(d); 
} 

int main() 
{ 
    test(nullptr); 
} 

를 인수는 변환 된 유형에서 관계없이, double*입니다. static_assertT는 포인터 타입도 순서에있을 수 있음을 보장 :

static_assert(std::is_pointer<T>{} || std::is_same<T, std::nullptr_t>{}, 
    "Not a pointer type!"); 

참고 : C++ 14도 std::is_null_pointer을 소개합니다.

1

test(nullptr) 호출 한 후에는 null가 일어나는 double*을 가지고 있지만 값이 런타임 속성, 그 정적 유형은 double*이고 그래서 test_ptr(d) 항상 test_ptr(double*)를 선택합니다. 오버로딩은 런타임 값을 기반으로하지 않고 유형을 기반으로 컴파일 타임에 함수를 선택합니다.

관련 문제