Может кто-нибудь объяснить использование BaseTypeX::BaseTypeX в этом коде?


У меня есть некоторый код, который делает следующее, Но я не понимаю, что using BaseTypeX::BaseTypeX на самом деле делает в этом коде. Остальное я понимаю, поэтому, пожалуйста, не объясняйте специализацию шаблона и т. д.

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
        }   
2   5   2014-04-10 00:17:07

2 ответа:

Это означает, что вы наследуете все конструкторы Internal::ClassXImpl<TReturn, TArgs...>. Более простой пример может лучше проиллюстрировать это:

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
}

Без using Foo::Foo вам пришлось бы объявить и определить все конструкторы в Bar и вызвать соответствующий конструктор Foo в каждом из них.

Это означает, что класс шаблона ClassX наследует конструкторы своей базы. См. здесь для обсуждения этой темы.