2014-04-09 14 views
5

Tôi có một số mã đang làm như sau nhưng tôi không hiểu những gì using BaseTypeX::BaseTypeX thực sự đang làm trong mã này. Phần còn lại của nó, tôi hiểu vì vậy xin không giải thích mẫu chuyên môn, vvCó thể ai đó vui lòng giải thích cách sử dụng BaseTypeX :: BaseTypeX trong mã này không?

template<typename TReturn, typename... TArgs> 
class ClassX<TReturn(TArgs...)> : public Internal::ClassXImpl<TReturn, TArgs...> { 
public: 

    using BaseTypeX = Internal::ClassXImpl<TReturn, TArgs...>; 
    using BaseTypeX::BaseTypeX; // what is this doing exactly? 

    inline ClassX() noexcept = default; 

    // member function 
    template<class TThis, class TFunc> 
     inline ClassX(TThis* aThis, TFunc aFunc) { 
      this->bind(aThis, aFunc); // note bind is implemented in the ClassXImpl class 
     } 

Trả lời

10

Nó có nghĩa là bạn được thừa hưởng tất cả các nhà thầu của Internal::ClassXImpl<TReturn, TArgs...>. Một ví dụ đơn giản có thể minh hoạ rõ hơn điều này:

struct Foo 
{ 
    Foo(int); 
    Foo(int, double); 
    Foo(std::string); 
}; 

struct Bar : Foo 
{ 
    using Foo::Foo; 
}; 

int main() 
{ 
    Bar b1(42); // OK, Foo's constructors have been "inherited" 
    Bar b2(42, 3.14); // OK too 
    Bar b2("hello"); // OK 
} 

Nếu không có sự using Foo::Foo, bạn sẽ phải khai báo và xác định tất cả các nhà thầu trong Bar, và gọi Foo constructor tương ứng trong mỗi một trong số họ.

+1

+1 oh wow Tôi không biết điều đó! Cám ơn rất nhiều. Tôi sẽ chấp nhận điều này như một câu trả lời khi thời gian trôi qua để cho phép tôi – bjackfly

1

Điều đó có nghĩa là lớp mẫu ClassX kế thừa các hàm tạo của cơ sở. Xem here để thảo luận về chủ đề.

+0

+1 cảm ơn điều này sẽ giúp ích cho bạn. ví dụ trong câu trả lời khác thực sự củng cố nó cho tôi. – bjackfly

Các vấn đề liên quan