>

C ++ 0x에서 모든 부모 생성자를 전달하는 올바른 방법은 무엇입니까?

이 작업을 수행했습니다 :

class X: public Super {
    template<typename... Args>
        X(Args&&... args): Super(args...) {}
};


  • 답변 # 1

    C ++ 0x에는 더 좋은 방법이 있습니다

    class X: public Super {
      using Super::Super;
    };
    
    

    완벽한 전달 템플릿을 선언하면 오버로드 확인시 형식이 잘못 작동합니다. 기본 클래스가 int 에서 변환 가능하다고 상상해보십시오.  클래스를 출력하는 두 가지 함수가 있습니다

    class Base {
    public:
      Base(int n);
    };
    class Specific: public Base {
    public:
      template<typename... Args>
        Specific(Args&&... args);
    };
    void printOut(Specific const& b);
    void printOut(std::string const& s);
    
    

    전화로

    printOut("hello");
    
    

    무엇을 부를 것인가? Specific 때문에 모호합니다.  문자형 배열을 포함한 모든 인수를 변환 할 수 있습니다.기존 기본 클래스 생성자와 상관없이그렇게합니다. 선언을 사용하여 상속자를 생성하면이 작업을 수행하는 데 필요한 생성자 만 선언합니다.

  • 답변 # 2

    나는 생각하고당신은 Super(std::forward<Args>(args)...) 를해야한다  물건을 제대로 전달하려면 와이즈 비즈  이름이 있으므로 rvalue 참조 전에 일반 참조에 바인딩됩니다.

    더 중요한 것은 이런 식으로 복사 생성자를 전달하지 않을 것입니다. 컴파일러는 템플릿 생성자를 고려하지 않기 때문에 여전히 컴파일러를 생성합니다. 제공된 예제에서는 컴파일러가 생성 한 것이므로 부모 사본 생성자를 호출하기 만하면됩니다. 정확히 원하는 것입니다. 더 복잡한 경우에 적합하지 않은 경우 직접 작성해야합니다.

    args

  • 이전 javascript - jQuery mobile에서 tap과 vclick의 차이점은 무엇입니까?
  • 다음 graphviz - dot 트리에서 수평 노드 순서 적용