티스토리 뷰

반응형

예외를 던지지 않는 SWAP에 대한 지원도 생각해 보자

타이틀 입력부분C++에서 SWAP 이란 두 객체의 값을 ‘맞바꾸기’한다는 것을 말함.

기존의 SWAP의 동작을 보면

1
2
3
4
5
6
7
8
9
10
11
12
13
namespace 
{
    void swap(int a,int b)
    {
         int temp;
        Temp = a;
        a = b;
        b = temp;
    }
 
}
 
 
cs

어김없이 동작을 하게 되어있습니다.
하지만 예외의 swap의 동작을 요구하는 swap도 있습니다.

예제1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
class AA
{
public:
private:
    int a,b,c;
    std::vector<double>v;
};
 
class BB
{
private:
      AA* pImpl;
public:
    BB(const BB &rhs);
    BB& operator=(const BB& rhs)
    {
        *pImpl=*(rhs.pImpl);
    }
};
 
void main()
{
    BB a;
    BB b;
}
 
 
 
cs

만약 위의 경우 내포 클래스의 인자인 *pImpl만 살짝 바꾸는 것 말고는 실제로 할 일이 없습니다.
이러한 점은 표준 swap 알고리즘에는 정의되어 있지 않습니다.
다른 타입들과 마찬가지로 BB의 객체를 3번 복사하고 AA의 객체도 세번 복사하는 현상이 일어납니다.
이러한 문제점을 개선하기 위해서 BB에 대해 특수화를 하는 방법이 있습니다.

방법

 

1
2
3
4
5
6
7
8
9
10
namespace
{    
    template<T>
    void swap<BB>(BB& a, BB& b)
    {    
        Swap(a.pImpl,b.piml);    
    }
}
 
 
cs

시작 부분의 template<>는 이 함수가 std::swap의 완전 템플릿 특수화를 컴파일러에게 알려주는 부분이고
그리고 함수 이름 뒤에 있는 <BB>는 T가 BB클래스 일 경우에 대한 특수화라는 사실을 알려주는 부분이고
타입에 무관한 swap 템플릿이 BB클래스 적용될 때는 위의 함수 구현을 사용해야 한다는 뜻이 됩니다.

 

 

결론

std::swap이 타입에 대해 느리게 동작할 여지가 있다면 swap 멤버 함수를 제공하여 swap은 예외를 던지지 않도록 만듭시다.

멤버 swap을 제공했으면 이 벰버를 호출하는 비벰버 swap도 제공합니다.
클래스(템플릿이 아닌)에대해서는 std::swap도 특수화해 둡시다.

사용자 입장에서 swap을 호출할 때는 std::swap에 대한 using 선언을 넣어준 후에 네임스페이스 한정 없이 swap을 호출합시다.

사용자 정의 타입에 대한 std 템플릿을 완전 특수화하는 것은 가능합니다.
그러나 std에 어떤 것이라도 새로 ‘추가’하려고 들지는 마십시오.

반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함