다른 사람들은 코드가 작동하지 않는 이유와 개선 방법에 대해 설명했습니다.
이제
난 당신이 여전히 컴파일하려면 다음 코드를 얻을 수있는 방법을 보여 드리겠습니다 - 그리고 제대로 작동하려면 :
double* a = CreateArray(5);
int* b = CreateArray(7);
문제, 이미 언급 한 바와 같이, C++가에서 템플릿 인수를 추론하지 않는다는 것입니다 반환 유형 만
위의 함수가 간단한 프록시 개체를 반환하도록함으로써이 제한을 피할 수 있습니다. 프록시 개체에는 단일 작업이 있습니다. 즉 암시 적으로 T*
으로 변환됩니다. 실제 할당이 이루어지는 곳입니다.
CreateArray
기능 때문에 매우 간단
(하고 있지 템플릿) 프록시로서는
CreateArrayProxy CreateArray(std::size_t num_elements) {
return CreateArrayProxy(num_elements);
}
: π로서
struct CreateArrayProxy {
std::size_t num_elements;
CreateArrayProxy(std::size_t num_elements) : num_elements(num_elements) { }
template <typename T>
operator T*() const {
return new T[num_elements];
}
};
쉬운.
이제이 코드를 사용해야합니까? 아니, 아마. 직접 할당보다 실질적인 이점은 없습니다. 그러나 그것을 아는 것은 유용한 관용구입니다.
어떤 문제가 발생합니까? – sharptooth
왜 std :: vector가 당신을 위해 그것을 할 때 당신은 스스로 배열을 만들고 싶습니까? –
n * n * n의 배열을 만들고 싶습니다. 그리고 이것 모두는 특별한 경우입니다. – ObiSan