2014-07-11 1 views
0

배열 함수 (예 : 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++ 프로그램에서 원시 포인터로 전달됩니다. 성능이 우선 순위이기 때문에이를 표준 컨테이너로 변환하고 다시 적용하는 것은 매력적이지 않습니다.

+0

문제가 있습니다. 귀하의 경우에 가장 좋은 방법은 오버로드를 피하는 것입니다. –

+0

관련 : [선언과 정의 사이의 const 한정자의 일관성없는 사용] (http://stackoverflow.com/a/20659598/1708801). 그것은 효과가 있지만 매우 이상합니다. 두 개의 다른 이름을 사용하는 것이 더 나을 것입니다. –

+0

원시 포인터에 표준 알고리즘을 사용할 수 있습니다. 참조 : http://stackoverflow.com/questions/16445957/can-raw-pointers-be-used-instead-of-iterators-with-stl-algorithms-for-containers – user1937198

답변

1

변환 도구를 사용하여 사각형을 지정하고 사용자가 변환을 사용하도록 결정할 수 있도록 작성하십시오. (이 간단한 경우 함수는 펑터 대신 사용할 수 있습니다.)

template<class T> 
T square(const T& x) 
{ 
    return x*x; 
} 

int *in, *out; 
size_t size; 

std::transform(in, in + size, out, square<int>); // ex situ 
std::transform(in, in + size, in, square<int>); // in situ 
+0

감사합니다 만족스러운 접근 방식 인 것 같다. 템플릿 f (T * in, int size, T * out) {if (in == out)/* 원위치 버전 */else/* ex situ version * /}'분명히 더 많은 것을 만든다. 실제로 & in-situ 버전 사이에 차이가있는 (정사각형이 아닌) 조바꿈과 같은 기능에 대한 감각! –

3

제발 그렇게하지 않으면 사용자가 상당히 혼란스러워 할 것입니다. 두 개의 서로 다른 이름으로 두 개의 다른 기능을 만드십시오.

관련 문제