2014-04-09 4 views
5

Ich habe einige Code, der das Folgende tut, aber ich verstehe nicht, was die using BaseTypeX::BaseTypeX tatsächlich in diesem Code tut. Der Rest davon verstehe ich also bitte nicht Template-Spezialisierung usw.Kann jemand bitte die Verwendung von BaseTypeX :: BaseTypeX in diesem Code erklären?

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 
     } 

Antwort

10

Es bedeutet, dass die Konstrukteure alle Internal::ClassXImpl<TReturn, TArgs...> Sie erben erklären Sie. Ein einfacheres Beispiel könnte dies besser veranschaulichen:

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 
} 

Ohne die using Foo::Foo, würden Sie alle Konstrukteure in Bar, und rufen Sie das jeweilige Foo Konstruktor in jedem von ihnen zu erklären haben und zu definieren.

+1

+1 oh wow, das wusste ich nicht! Vielen Dank. Ich werde dies als eine Antwort akzeptieren, sobald die Zeit vergeht, um mir zu ermöglichen, – bjackfly

1

Dies bedeutet, dass die Vorlagenklasse ClassX die Konstruktoren ihrer Basis erbt. Eine Diskussion zu diesem Thema finden Sie unter here.

+0

+1 Dank dies hilft. das Beispiel in der anderen Antwort hat es auch für mich wirklich verfestigt. – bjackfly

Verwandte Themen