2014-04-09 17 views
5

Ho un po 'di codice che sta facendo quanto segue, ma non capisco cosa stia facendo in questo codice using BaseTypeX::BaseTypeX. Il resto capisco quindi per favore non spiegano modello di specializzazione eccQualcuno può spiegare l'utilizzo di BaseTypeX :: BaseTypeX in questo codice?

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 
     } 

risposta

10

Significa che ereditano tutti i costruttori di Internal::ClassXImpl<TReturn, TArgs...>. Un esempio più semplice potrebbe illustrare meglio questo:

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 
} 

Senza il using Foo::Foo, si dovrà dichiarare e definire tutti i costruttori in Bar, e chiamare il rispettivo Foo costruttore in ognuno di loro.

+1

+1 oh wow non lo sapevo! Grazie mille. Lo accetterò come risposta una volta che il tempo passerà per consentirmi di rispondere a – bjackfly

1

Significa che la classe template ClassX eredita i costruttori della sua base. Vedi here per una discussione sull'argomento.

+0

+1 grazie. l'esempio nell'altra risposta lo ha davvero solidificato anche per me. – bjackfly

Problemi correlati