Adam
그는 물었다 12년 전
112

표준용량 스왑이란 오버로드할 방법 ()

' ()' 가 많은 표준용량 컨테이너입니다 표준용량 스왑이란 사용하는 동안, 심지어 할당에서는 정렬 (표준용량 벡터입니다 표준용량 목록 '와' 등 '').

그러나 표준용량 구현 '스왑이란 ()' 가 일반화된 않고 매우 비효율적인 사용자 유형에 대한.

따라서 효율 () '와' 사용자 정의 유형별 구축현 표준용량 스왑이란 오버로딩에 의해 얻을 수 있습니다. 하지만 이를 구현할 수 있도록 표준용량 컨테이너입니다 사용될 수 있는 방법은?

답변 4 개

옳은 길로 스왑할 오버로드할 같은 네임스페이스에 # 39 는 쓸 수 있도록 하고, 어떤 you& 교환을 통해 korea. [인수 종속적입니다 조회 (adl)] (https://en.cppreference.com/w/cpp/language/adl). 특히 한 쉬운 일인 입니다.

class X
{
    // ...
    friend void swap(X& a, X& b)
    {
        using std::swap; // bring in swap for built-in types

        swap(a.base1, b.base1);
        swap(a.base2, b.base2);
        // ...
        swap(a.member1, b.member1);
        swap(a.member2, b.member2);
        // ...
    }
};

Community
JoeG
그는 10년 전 댓글을 달았습니다
1

39 의 깨끗한 that& 제공할 수 있지만, 사용자가 정의한 스왑하는 운행에서어떠한 doesn& # 39 를 요구하고 있기 때문에, 표준용량 정렬하려면 질문자, t help 시나리오에 대한 doesn& # 39, adl 사용하여 스왑할 찾을 수 없다.

Dave Abrahams
그는 10년 전 댓글을 달았습니다
11

2003년, s # 39 의 c++컴파일러는 it& 기껏해야 언더스피치피들. # 39, ADL 찾을 수 있지 않지만, 대부분의 구축 사용 할 수 있도록 스왑할 it& s not 요구되는 can& # 39, t 신뢰할 수 있습니다.

    • OP 에서 볼 수 있는 것처럼 하는 특정 구체적인 유형을 표준용량 스왑이란 수 있습니다. 그냥 don& # 39, t, 해당 유형의 클래스뿐만 파생됨 afaq 특수화에 사용할 수 있을 것으로 기대하고 있다. (예:
Howard Hinnant
그는 9년 전 댓글을 달았습니다
15

난 여전히 , t # 39 사용하여 구현할 수 있음을 알게 될 것이라고 놀란 don& ADL com/go/downloads_kr 올바른 스왑이란. Ldmf 는 기존 입장을 밝혔다. # 39 구축상의 doesn& 사용할 경우, t, ADL com/go/downloads_kr 스왑하는 파일링하는 버그 리포트.

Dave Abrahams
그는 9년 전 댓글을 달았습니다
1

누군가 라이브러리) 와 함께 제공되는 므스티스 확인해야 합니다. 그들은 오랫동안 알박기 한 그러니까말이야 여기있을 하나.

0xbadf00d
그는 9년 전 댓글을 달았습니다
0

39 이것은, 내가 don& 좋은 생각인 것 같지는 않다. 첫째: 왜 이 기능을 정의점에 http://support. 글로벌 유효범위 국한됨? # 39, s, t # 39 there& 이유도 좁히어 shouldn& 함수은 구성원이 될 수 없다. 둘째, & # 39 이 코드는 두 개의 구현을 위한 스왑할 X& # 39 는 우리가;;). 그 중 기본값입니다 표준용량 네임스페이스이며 이겁니다.

Dave Abrahams
그는 9년 전 댓글을 달았습니다
3

@Sascha: 첫째, 함수 정의, I& # 39 m, s # 39 만 정의 사람이었는가부텀 that& 유효범위 http://support. 이름공간이 때문에 중요한 역할을 하는 일반적인 증상이다. 같도다라고 int et. al. # 39, # 39, 멤버 함수를, 표준용량 정렬하려면 et don& t/can& 없다. al. 무료 기능을 사용할 수 있다. 그들은 建立既能衡量 프로토콜. 둘째, 왜 내가 모르는 don& # 39, 객체 클래스는 두 가지 구축, 기울이나 정렬할지 경우, t # 39 는 비회원 수용할 수 있어 스스로 기술입니까 can& 스왑이란. 규칙요 부담을 주지 않도록 모두 볼 수 있다 (이) 한 경우, 이 선언을 한 때 보다 구체적인 검증 없이 호출됨 스왑할 선택됩니다.

JoeG
그는 9년 전 댓글을 달았습니다
1

@Howard 히넌트: 표준 라이브러리의 구현에 찾기 위해 사용하는 경우, 함수 호출 '다음' s # 39, ADL 스왑할 it& 줄바꿈할. '표준' 을 구현하면 표준용량 정렬하려면 착수 여부에 관계없이 요건을 충족합니다 합니다 '라는 사용자가 정의한 이름공간이 스왑이란' 존재하는 함수 (신앙이니라 사용자 는 '표준용량 스왑이란' 그 '' 그렇지 않을 경우 정의되지 않은 행동을 호출하십시오 표준용량 스왑이란 특수화에 요건을 충족시켜야 한다).

JoeG
그는 9년 전 댓글을 달았습니다
2

C++11 은 C++03 - 유형 및 요구 사항을 스왑 () 은 위 주석문입니다 c++98 섹선에서 17.6.3.2.

voltrevo
그는 9년 전 댓글을 달았습니다
0

@JoeGauterin: 이와 함께 이 방법으로 정의된 메서드를 사용하여, 표준용량 정렬하려면 스왑이란 그냥 테스트되었습니다 mgcc 있다. 그렇다면 이 점에 대해 mgcc 호환되지 않는 것은?

voltrevo
그는 9년 전 댓글을 달았습니다
0
  • 1 은 활용할 가능성이 있기 때문에 내 클래스를 사용하여 클라이언트여야 Foo who wants to 스왑할 표준용량 스왑이란 (foo1, foo2) 가 자동으로 list. 비효율적이었습니다 기본 방법입니다.
JoeG
그는 9년 전 댓글을 달았습니다
5

@Mozza314: 경우에 따라 다릅니다. 하지만 C++11 은 C++03 맞추기 'a' 표준용량 정렬하려면 adl 스왑용 요소를 사용하는 비 순응. 1 도, 왜 사실을 근거로 사용할 수 있는 답을 클라이언트뿐 비 관용적 코드?

voltrevo
그는 9년 전 댓글을 달았습니다
1

그럼 저는 사용되었기 때문에 그런 것 같아요 - 표준용량 = c++0x mgcc 4.4 일 없이 it& # 39 의 비호환. 내가 이상한 것을 알 수 있지만, 내가 아는 어떤 경우에도 맞추기 때문에 매우 mgcc didn& # 39, t) 이 아닌 다른 면제 내보내기입니다. 또한, 성어는 사용하는 방법에 대해 호기심을 갖고 I& # 39 m '표준용량 스왑이란. 스왑이란 (foo1, foo2), '가 있는 만큼, 이 때문에 대부분의 사용하는 코드가 밖으로의 단계 표준용량 코트 표준용량 pow 경구 등이 구체적으로 알려진 이벤트여야만 아니하였으매 믿는 사람들을 위한 연구도 있다. # 39 m, t # 39 한 후, i& c++컴파일러는 개발자 쉐퍼드도 didn& 안단말이야, 짚, 그냥 내 동료, 그들은 didn& # 39 의 폴링할 몇 가지 못했다, t 안단말이야 중 하나.

Dave Abrahams
그는 9년 전 댓글을 달았습니다
1

@Mozza314: 내가 wouldn& # 39, t call it 비호환. 이것은 맞추기 시작한 이후 언더스피치피들 ADL 사용하여 확장자입니다. 뭐라고 말해야 할지 확신하지 못하고 대한 관심의 대상이 되었다. # 39 의 오른쪽 관용구 that& 않으면 사용할 수 있는 좋은 운영까지도 잡기 위한 래퍼 (http://www.boost.org/doc/libs/release/libs/utility/swap.html) 와 같은 검증 (부스트 스왑이란 (x, y)) 을 사용할 수 있는 불렀으매 adl 내부적으로.

curiousguy
그는 7년 전 댓글을 달았습니다
0

어떻게 이 underspecified&quot @daveabrahams 판매업체에서 ";? 표준 허용하지 않고 그냥 해! 지정하십시오. 미허용 금지되어 있습니다.

Dave Abrahams
그는 7년 전 댓글을 달았습니다
4

@curiousguy: 만약 판독값 이 표준은 단순한 것은 판독값 표준 전날에약혼자에게 맞겠지 :-). 저자의 의도를 죄송합니다. 중요하지 않다. 그래서 만약 원본 또는 사용해야 할 수 있는 의도가 ADL 조롱이라면 언더스피치피들. 그렇지 않으면 그냥 plain old 끊기 위한 변경하십시오 C++0x, 그래서 작성했습니까 "로 베스트 '언더스피치피들.

curiousguy
그는 7년 전 댓글을 달았습니다
0

@DaveAbrahams 의도가 사람들이 어떻게 알아? Do you have a 소스? (스크립트입니다 의 해상도, 설계, 토론, 논쟁을 스레드할 http://competition. 의도 나타낼 수 있습니다)

Paolo M
그는 5년 전 댓글을 달았습니다
2

네, 그가 없는 @curiousguy 소스! 아녀석은 [donatelli 에이브럼스] (https://en.wikipedia.org/wiki/David_Abrahams_ (computer_programmer))

  • Mozza314* 관심이 쏠리고 있다.

다음은 '', '일반' 표준용량 알고리즘입니다 호출하십시오 표준용량 스왑이란 미칠 배빠르게 한 사용자가 있는 그들의 스왑하는 구매와 제공하십시오 이름공간이 표준용량. 이를 이용한 실험을 통해 ',' 대신 '이름공간이 표준용량' 이 배빠르게 /dev/raw/raw1 이름공간이 exp.

// simulate <algorithm>

#include <cstdio>

namespace exp
{

    template <class T>
    void
    swap(T& x, T& y)
    {
        printf("generic exp::swap\n");
        T tmp = x;
        x = y;
        y = tmp;
    }

    template <class T>
    void algorithm(T* begin, T* end)
    {
        if (end-begin >= 2)
            exp::swap(begin[0], begin[1]);
    }

}

// simulate user code which includes <algorithm>

struct A
{
};

namespace exp
{
    void swap(A&, A&)
    {
        printf("exp::swap(A, A)\n");
    }

}

// exercise simulation

int main()
{
    A a[2];
    exp::algorithm(a, a+2);
}

이 가져다줄래요 를출력합니다:

generic exp::swap

그 후 제대로 구현하는 것은 뭔가 다른 게 있다면, 이 상 를출력합니다 컴파일러와의 &quot lookup&quot. 템플릿.

(모든 c++ 컴파일러는 따를 경우 98/03/11), 그런 다음 동일한 출력을 부여하느뇨 가르켜. 정확히 어떤 두려움이, 이런 경우에는 일어나지 않는 것입니다. 네, 전면에 내세우는 '스왑이란' 에 '표준용량' ('확장') 이 발생하지 않도록 이름공간이 멈추지 않았다.

정보위 소속 의원들은 모두 donatelli 쉐퍼드도 십 년 동안 이 지역 및 행한 기준이 아닌 합의에 따라 항상 서로). 그러나 이 문제는 그동안 오랫동안 정착하고 있는 데, 우리가 어떻게 현재까지 모두 마무리됐다. # 39 이 분야의 전문가 의견조사를 통해 현재 자신의 Dave& disregard, s / 답변을 한다.

이 문제는 큐피드라는 표시등으로 C++98 후에 출판되었다. 작동합니까 이 지역 donatelli 쉐퍼드도 시작 약 2001년 시작했다. 이것이 현대 해결책:

// simulate <algorithm>

#include <cstdio>

namespace exp
{

    template <class T>
    void
    swap(T& x, T& y)
    {
        printf("generic exp::swap\n");
        T tmp = x;
        x = y;
        y = tmp;
    }

    template <class T>
    void algorithm(T* begin, T* end)
    {
        if (end-begin >= 2)
            swap(begin[0], begin[1]);
    }

}

// simulate user code which includes <algorithm>

struct A
{
};

void swap(A&, A&)
{
    printf("swap(A, A)\n");
}

// exercise simulation

int main()
{
    A a[2];
    exp::algorithm(a, a+2);
}

출력은 다음과 같습니다.

swap(A, A)

  • 업데이트 *

그동안 관찰을 분명히 했다.

namespace exp
{    
    template <>
    void swap(A&, A&)
    {
        printf("exp::swap(A, A)\n");
    }

}

작동됨! 그 때문에 사용하지 않는 이유는?

'A' 는 해당 사건을 고려해보십시오 클래스용 템플리트를:

// simulate user code which includes <algorithm>

template <class T>
struct A
{
};

namespace exp
{

    template <class T>
    void swap(A<T>&, A<T>&)
    {
        printf("exp::swap(A, A)\n");
    }

}

// exercise simulation

int main()
{
    A<int> a[2];
    exp::algorithm(a, a+2);
}

이제 다시 doesn& # 39, 빗나갔다. :- (

그러니까 '에서' 스왑하는 이름공간이 표준용량 및 할꺼이나 작동합니까 있다고 한다. 그러나 you& # 39, & # 39 스왑이란 '에서' ll 기억할 필요가 있어, 'A' s 이름공간이 경우에 대비하여 템플리트를: t&gt A&lt, ','. 두 경우 모두 사용할 수 있는 '뒤', 'A' s & # 39 스왑할 놓으면 바로 네임스페이스인 쉽게 기억할 수 있는 방법 중 하나는 (그리고 다른 teacher) 를 just do it.

Andrea Corbellini
voltrevo
그는 9년 전 댓글을 달았습니다
4

아주 많이 대한 보다 상세한 답변 고맙습니다. 나는 혹시 다른 방법 및 전문화 너무 적은 대해 잘 알고 있었고 실제로 이 확실히요 생산할 수 있다. 그러나 I& # 39 m not 제안하고 있지만, 너무 전문화. 내가 언제 어디서 구할 수 있는 ',', '템플리트를 동일팔레트에 &lt &gt 출력입니다 exp 스왑이란 (a, a)' 의 첫 번째 예제는 mgcc. 따라서 왜안돼요 포지셔닝하십시오 전문화?

Howard Hinnant
그는 9년 전 댓글을 달았습니다
1

탁월한 점! 서식 구속을 다시. 추가 대답.

voltrevo
그는 9년 전 댓글을 달았습니다
1

와우! 이거 진짜 계몽적인. 나를 말해둘꼐요 확신하고 있습니다. 내 생각엔 약간 구문을 사용하여 에서 친구 추천 및 내아기마저도 수정하십시오 동급 donatelli 에이브럼스 (안녕하슈 operator&lt &lt, 이 사용할 수 있습니다. 너무! -) 뿐만 아니라, 그런 상황을 피하기 위한 특별한 이유가 없는 경우 (컴파일하기를 아닌 별도). 또한 예외가 아니다 '는' 이 빛을 사용하여 생각해 표준용량 스왑이란 &quot 배반자들의 동일팔레트에 명령문입니다 δ1 헤더입니다 사용하여 files"; 규칙? 실제로 사용하는 ',', '' 인사이드라면 표준용량 스왑이란 왜안돼요 동일팔레트에 &lt algorithm&gt? 예를 들어, 나는 이 작은 코드 s # 39, 소수 people& 손상될 수 있다. 아마 업신 여기다 지원 및 결국 넣어?

Howard Hinnant
그는 9년 전 댓글을 달았습니다
3

동급 친구 구문 문제가 없어야 합니다. '' 를 사용하여 함수 범위 내에서 헤더도 표준용량 스왑이란 꼭 이래야겠어요 제한합니다. 예, '스왑이란' 는 거의 키워드. 그러나 키워드를 않다. 그래서 모든 네임스페이스을 보살피되 정말 최고의 익스포트하려면 않을 수 있다. 'like' 훨씬 '스왑하는 작동자 ='. 심지어 '=' 을 (를) 의 생각 안 된다는 것을 가장 큰 차이점은 판매업체에서 연산자입니다 검증함 이름공간이 구문 (다만 것이라고 너무 ugly).

voltrevo
그는 9년 전 댓글을 달았습니다
0

뭔가 나쁜 일이 있는 것은 이 모든 네임스페이스을 신앙이니라 익스포트하기 스왑하는 분할하려면, 연습, 이를 공개할 수 있도록 고정식입니다. # 39 의 that& 좋은 일 맞죠?

Howard Hinnant
그는 9년 전 댓글을 달았습니다
0

&lt shrug>; C++ 은 살아있는, 진화하는 욕금지 아마 너희는너희가 청혼이요 적립율은 수용할 수 있는 커뮤니티 또 다른 10 년이다. 결국 that& # 39 에 대한 afaq 오늘 우리가 어디에 얼마나 오래 걸렸다. -)

curiousguy
그는 7년 전 댓글을 달았습니다
0

(모든 c++ 컴파일러는 &quot 너회의 if 맞추기, 98/03/11), 그런 다음 동일한 출력을 부여하느뇨 내가 show.&quot. 이 문제에 대해 침묵을 이스마 C++98 때 어떻게 해야 할까요?

Howard Hinnant
그는 7년 전 댓글을 달았습니다
0

@curiousguy: 당시 이 상 lookup&quot 청구서가 에로남이네 C++98 문제에 대해 침묵을 "; 템플릿?!

curiousguy
그는 7년 전 댓글을 달았습니다
0

일정한 자격을 갖춘 @howardhinnant 이름, 분명히. 이름 없는 굳었나이다.

Howard Hinnant
그는 7년 전 댓글을 달았습니다
15

@NielKirk: 단지 잘못된 답을 너희는너희가 합병증 너무 많은 것으로 보고 있다. # 39 donatelli Abrahams& 대한 복잡한 게 없다. 정답: &quot, 옳은 길로 스왑할 오버로드할 같은 네임스페이스에 # 39 는 쓸 수 있도록 하고, 어떤 you& 인수 종속적입니다 조회 (adl) 교환을 통해 korea. .&quot.

codeshot
그는 5년 전 댓글을 달았습니다
0
    • 는 좀 더 복잡한 우리 섹스한거요. 이 게시물은 찾을 수 있습니다 (a) 이 솔루션은 알 한 알 수 없는 믿음을 잃지 각오하랬지 (c) (b) 현재 권장됨 두려워하 항목이없습니다.
Howard Hinnant
그는 5년 전 댓글을 달았습니다
2

@codeshot: 죄송합니다. 이후 1998년 걸쳐 허브 설정되었습니다 afaq afnor 메시지가 있다. http://www.gotw.ca/publications/mill02.htm # 39, 그는 이 글에서 스왑할 언급하십시오 doesn& 없다. 하지만 이것은 단지 Herb& # 39 의 인터페이스를 적용, 다른 것이다.

codeshot
그는 5년 전 댓글을 달았습니다
1

39 에 불과한 작은 부분을 guru& 풀. 스택 오버플로, 구글 검색 등이 있는 사람들이 얼마나 잘못 형성된 쿼리합니다 프레젠테이션이든 things done. # 39 의 소프트웨어 공학 산업의 i&, ve been apc® 10 여 년 동안 내 동료 (내가 주로 하는 배운), t, t know didn& # 39 이 didn& # 39 가르치는 정보기술 (it), (강하게 강하게) 다른 방향에서 슬쩍 찔렀다.

Pharap
그는 2년 전 댓글을 달았습니다
0

저도 &quot exp 스왑이란 (a, a) "; 'template< class 를 사용할 때 T&gt. 구조체입니다 A '가 된다.

Howard Hinnant
그는 2년 전 댓글을 달았습니다
1

Visual Studio 가 아직 제대로 구현하는 2 단계 조회 규칙요 c++98 도입되었다. 즉, 잘못된 스왑할 예제에서와 페이징됩니다 'VS'. 내가 이 hadn& # 39 는 새 주름, 이전에 볼 수 없다. '의 경우, 클래스용 template&lt T&gt. 'A', '네' 있다 '' 에 이름공간이 구조체입니다 스왑할 표준용량 코드에 렌더링합니다 비 휴대용. 예를 들어 아웃해야 너회의 시도하시겠습니까 반트상자 확인할 수 있는 mgcc 및 클랭 있어요

39, re 표준용량 스왑이란 오버로드할 you& 미허용 (대표 c++ 표준) 를 추가할 수 있도록 허용할 수 있지만 특별히 틀렸다니까 템플리트를 단축시킵니다 특수화 İç 유형은상위 표준용량 이름공간이. E. g.

namespace std
{
    template<>
    void swap(my_type& lhs, my_type& rhs)
    {
       // ... blah
    }
}

그 용도를 std 컨테이너입니다 (및 다른 곳에) 가 아닌 일반 불신하니 특수화에 선택하세요.

또한 제공하는 기본 클래스의 구현은 스왑이란 isn& # 39, t good enough for your 파생됨 유형. E. g. 경우

class Base
{
    // ... stuff ...
}
class Derived : public Base
{
    // ... stuff ...
}

namespace std
{
    template<>
    void swap(Base& lha, Base& rhs)
    {
       // ...
    }
}

이렇게 하면 사용할 수 있지만, it 기반 클래스 두 파생됨 객체에는 스왑용 사용할 수 있기 때문에 일반 버전의 표준용량 체계화된 스왑이란 는 정확하게 일치 (및 base& # 39, & # 39 만 바꾸어 문제를 방지할 수 있습니다. 해당 부분을 파생됨 객체에는).

참고: # 39 에서 이 잘못된 비트가 지루려면 i&, ve 업데이트되도록 내 마지막 대답. 으-흠 d& # 39. (고마워 푸치크 및 j_random_hacker 포인팅 아웃해야 대한)

Dan Nissenbaum
j_random_hacker
그는 11년 전 댓글을 달았습니다
1

좋은 조언, 하지만 나는 주로 의해 언급된 사이에 미묘한 차이를 - 1 로 슬픔으로창백해지고 푸치크 전문 템플릿이 표준용량 이름공간이 (원하는거요 허용하는 C++ 표준) 및 오버로딩 (디스크입니다. isn& # 39, t).

Wilka
그는 11년 전 댓글을 달았습니다
0

도프! 고마워 포인팅 가운데, it& # 39 의 컨텍스트로 오랜 만에 I& # 39, ve 몸을 스스로 잘못된 정보, 그래서 I& # 39 m 의 c++컴파일러는 좁히어:)

Howard Hinnant
그는 9년 전 댓글을 달았습니다
10

이 때문에 정답이 다운보테드 스왑할 사용자정의할 승인하십시오 사용자 정의 이름공간이 (as donatelli 에이브럼스 점 또 다른 답).

Dave Abrahams
그는 9년 전 댓글을 달았습니다
2

39 의 Howard& 다운보팅 내 이유 같습니다

Kos
그는 9년 전 댓글을 달았습니다
0

이 밖에 '수' (또는 다른 사항은요) 이지만, '표준용량 스왑이란 금기한 오버로드할 표준용량 스왑이란' 이름공간이?

voltrevo
그는 9년 전 댓글을 달았습니다
13

@HowardHinnant, 데이브 에이브럼스: 나는 전혀 그렇지 않다. 어떤 근거로 들어보겠소 하였노라너희가 너희 교체품 는 &quot correct"; 방법은? 구체적으로, 이는 표준 푸치크 에서 인용) 로 사용할 수 있습니다. # 39 m, I& 동안 이 문제에 대한 새로운 방법을 정보지지자 don& # 39, 만약 내가 정말 마음에 때문에 다른 사람이 내 코드는 사용자 정의 및 스왑이란 이쪽요 푸 (a, b) 보다는 스왑하는 표준용량 스왑이란 활용할 가능성이 있는 (a, b) 는 foo 자동으로 비효율적이었습니다 기본 버전.

Howard Hinnant
그는 9년 전 댓글을 달았습니다
5

@Mozza314: 구속 및 서식 공간을 허용하지 않은 설명 영역을 완전히 회신과 날 수 있습니다. # 39 이라는 추가되든지, ve, 주의, &quot Mozza314&quot I& 오토메이티드 참조하십시오.

codeshot
그는 4년 전 댓글을 달았습니다
1

쉽게 생각해 볼 수 있는 이 기술은 또한 곧바로 규칙 1 정의 @howardhinnant, 그렇죠? 번역 포함되어 있으면 유닛이 &lt algorithm>; 기본 클래스 선언 및 공격수이다. 반면, 그러면 위에 있는 두 개의 서로 다른 인스턴스로 다른 dm_ownerdm_owner 헤더입니다 Base&gt std::swap<;). 그러나 이 기술을 사용하면 순응하는 이는 내가 재호출 금기한 인할지 프로그램을 성공적으로 합니다 수 없도록 한 것은 해당 클래스의 선언은 쓰지 못하게 해야 강제 짐작이지만요. - 앞으로 각자의 목표 달성에 헤더입니다 항상 있습니다. 이렇게 하면 비실용적입니다 드러날 수 dell. 배율입니다.

Chris_F
그는 일 년 전 댓글을 달았습니다
0

I believe 로 수정하십시오 C++20 시작으로 하는 것이 아니라 단지 템플리트를 클래스뿐만 템플리트를 총괄하였습니다.

39, s, t 일반적으로 그 동안 it& 수정하십시오 shouldn& # 39 를 추가 물건을 표준용량: 사용자 정의 형식용 특수화 네임스페이스인 추가 템플리트를 특별히 사용할 수 있습니다. 부담을 주지 않는 미묘한 차이, 이 제품은 기능을 :-)

&gt. 17.4.3.1/1 이 선언은 C++ 프로그램에 추가할 대한 정의 또는 정의되지 않았습니다. 수 있는 경우를 제외하고는 이름공간이 표준용량 또는 네임스페이스을 이름공간이 표준용량 지정되었습니다. 모든 프로그램이 템플리트를 특수화 추가할 수 있습니다. 표준 라이브러리 템플리트를 이름공간이 표준용량. 이런 특수화에 정의되지 않은 결과 표준 라이브러리 (전체 또는 부분) 사용자 정의 이름을 따라 행동을 한 것이다. external linkage 경우가 아닌 한 템플릿에는 충족합니다 특수화에 표준 라이브러리 요구사항을 원래 템플릿.

A 의 특수화에 std::swap&lt X>; 다음과 같습니다.

namespace std
{
    template<>
    void swap(myspace::mytype& a, myspace::mytype& b) { ... }
}

Template&lt 없이 >; 이 될 것이라고 하는 것이 아니라, 이는 비트 오버로드할 특수화에 정의되지 않은 것을 명시하고 있다. # 39 의 기본 이름공간이 작동합니까 @wilka& 제안하세요 외곽진입 변경할 수 있지만 it& 사용자 코드 (이 때문에 더 케이니그 조회 이름공간이 덜 버전) # 39, s, t really 돼 있으며, 실제로 isn& # 39 보장할 수 없습니다 (stl 은 구축현 표준용량 스왑이란 fully-qualified 사용할 수 있어야 한다).

[스레드할 켜짐이 comp.lang.c++.moderated] (있습니다 http://groups.google.ca/group/comp.lang.c ++.moderated/browse_thread/thread/b396fedad7dcdc81) 와 디쿠시온 기절해있는 주제의. 대다수 정보기술 (it) 란 부분 특수화에 표시되어도 (현재 어떤 there& # 39 의 no good 방식).

puetzk
Dave Abrahams
그는 9년 전 댓글을 달았습니다
7

한 가지 이유는 잘못된 it& # 39 의 기능을 사용하려면 템플리트를 특수화에 엔드입니다 (또는 기타 다른): 잘못된 방법으로 상호 작용, 이 중 정보기술 (it) 에 있는 과부하를 스왑용 많다. 예를 들어,, 일반 표준용량 스왑이란 std::vector&lt 위한 특화된 mytype&gt &amp 너회의 특수화에 won& standard& # 39, s, t get 사탄들 # 39 위에 있기 때문에, t # 39 로 오버로드할 해결안에서는 동안 특정 벡터입니다 스왑하는 aren& 사양입니다.

jww
그는 9년 전 댓글을 달았습니다
4

이 역시 어떤 것이 효율적인 c++컴파일러는 3ed 마이어스 (25 · pp 품목으로부터 106 112).

Davis Herring
그는 2년 전 댓글을 달았습니다
2

@DaveAbrahams: 하는 경우 (명시성 템플리트를 없이 인수만), 부분 벡터 '이' 하면 redhat. 오더할 박스트롤의 특수화에 of 버전 및 그 [사용될] (https://wandbox.org/permlink/dmHLwU5uxmFKtwDw).

Dave Abrahams
그는 2년 전 댓글을 달았습니다
1

실제로, 아니, 그렇게 할 때 @davisherring 부분 오더할 오빠예요-아니 역할을 한다. # 39, t, t # 39 isn& 문제가 전혀 호출하십시오 can& 합니다. # 39 의 in the presence of 확실히 총괄적 과부하를 스왑할 it& 무슨 일이 있다. https://wandbox.org/permlink/nck8BkG0WPlRtavV

Davis Herring
그는 2년 전 댓글을 달았습니다
2

@DaveAbrahams: 부분 순서 () 는 [선택 기능을 담당하는 템플리트를] (http://en.cppreference.com/w/cpp/language/function_template # Function_template_overloading) 때 일치시킵니다 명시성 특수화에 둘 이상의. '이' 는 '보다' 보다 전문화된 추가한 오버로드할 스왑이란 표준용량 스왑이란 "에 대한 벡터 '는 없고, 따라서 오버로드할 호출하십시오 후자의 특수화에 관련. 난 그게 현실적인 문제를 어떻게 잘 모르겠습니다. (그러나 이는 자랑합니까 나도 좋은 아이디어!).

Dave Abrahams
그는 2년 전 댓글을 달았습니다
0

@DavisHerring, 아, 그래, 그래. # 39, t 재호출 있었다는 '대한' 내가 didn& 스왑할 오버로드할 표준용량 벡터입니다. # 39 의 현실적인 문제 때문에 it& 생각한다 ',' s # 39 의 비헤이비어를 사용자정의하기 프로그래머용 he& 스왑할 특정 유형에 의해 작은 별 효과가 없다고 했지만, 그의 사용자정의를 렌더링됩니다 오버로드할 수 있습니다.