배열 함수 (예 : transpose)를 쓰고 있으며 동일한 기능의 해당 위치와 외부 위치 버전을 모두 갖고 싶어합니다. 원위치 버전은 빠르지 만 원래 배열을 변경합니다. ex situ 버전은 원본을 변경하지 않고 유지해야하는 경우에 사용되지만 복사본을 만들어야하므로 느립니다. 함수의 두 버전이 같은 이름을 가지길 바래요.하지만 C++에서 리턴 타입만으로는 함수를 구별 할 수 없다는 것을 알고 있습니다. 내가 ex situ 버전에 대한 const로 배열 매개 변수를 변경하여 그것을 수행하는 방법을 생각했지만, 내가 어디서나 언급 (예 : Overload a C++ function according to the return value)을 찾을 수 없기 때문에이 접근법에 문제가있을 수 있습니다 걱정이다C++에서 오버로드 함수에 대한 매개 변수 구성
// in situ version
void square(int* ip, int size)
{
for (int i = 0; i < size; i++)
ip[i] *= ip[i];
}
// ex situ version
int* square(int const* icp, int size)
{
int* ip = new int[size];
for (int i = 0; i < size; i++)
ip[i] = icp[i] * icp[i];
return ip;
}
// usage
int main()
{
int a[5] = {0, 1, 2, 3, 4};
square(a, 5);
// now a = {0, 1, 4, 9, 16}
int* b = square(const_cast<int const*>(a), 5);
// a still = {0, 1, 4, 9, 16}
// b = {0, 1, 16, 81, 256}
...
delete[] b;
...
return 0;
}
피드백에 감사드립니다.
** 일부 표준 컨테이너 및 라이브러리 (std :: vector, boost :: array)가 있음을 알고 있습니다. 그러나 Excel/VBA에서 호출 할 수있는 C++ DLL에 대한 작업을하고 있으므로 배열은 C++ 프로그램에서 원시 포인터로 전달됩니다. 성능이 우선 순위이기 때문에이를 표준 컨테이너로 변환하고 다시 적용하는 것은 매력적이지 않습니다.
문제가 있습니다. 귀하의 경우에 가장 좋은 방법은 오버로드를 피하는 것입니다. –
관련 : [선언과 정의 사이의 const 한정자의 일관성없는 사용] (http://stackoverflow.com/a/20659598/1708801). 그것은 효과가 있지만 매우 이상합니다. 두 개의 다른 이름을 사용하는 것이 더 나을 것입니다. –
원시 포인터에 표준 알고리즘을 사용할 수 있습니다. 참조 : http://stackoverflow.com/questions/16445957/can-raw-pointers-be-used-instead-of-iterators-with-stl-algorithms-for-containers – user1937198