Автоматическое создание конструктора на основе конструктора родительского класса (C ++) - PullRequest
3 голосов
/ 18 сентября 2009

Вот код, который я хотел бы получить для работы:

template <class A>
class B : public A {
public:
  // for a given constructor in A, create constructor with identical parameters,
  // call constructor of parent class and do some more stuff
  B(...) : A(...) {
    // do some more stuff
  }
};

Можно ли добиться поведения, описанного в приведенном выше примере?

Ответы [ 3 ]

8 голосов
/ 18 сентября 2009

Нет, в настоящее время это невозможно в C ++. Это называется «идеальная пересылка» и разрешено в C ++ 0x. Вы можете смоделировать его, создав перегрузки вашего конструктора до фиксированного максимума (например, 8 параметров), как для константных, так и для неконстантных ссылок. Это все еще не идеально (временные файлы не будут пересылаться как временные), но обычно работает на практике:

template<typename T1>
B(T1 &a1):A(a1) { 
  // do some more stuff
}

template<typename T1>
B(T1 const &a1):A(a1) { 
  // do some more stuff
}

template<typename T1, typename T2>
B(T1 &a1, T2 &a2):A(a1, a2) { 
  // do some more stuff
}

template<typename T1, typename T2>
B(T1 const &a1, T2 const &a2):A(a1, a2) { 
  // do some more stuff
}

template<typename T1, typename T2>
B(T1 const &a1, T2 &a2):A(a1, a2) { 
  // do some more stuff
}

template<typename T1, typename T2>
B(T1 &a1, T2 const &a2):A(a1, a2) { 
  // do some more stuff
}

// ...

Генерация может быть автоматизирована с помощью Boost.Preprocessor или некоторого скрипта, но это не совсем хорошо, так как количество перегрузок быстро растет.

Короче говоря, не пишите свои конструкторы самостоятельно, пока не будет доступен C ++ 0x, который поддерживает и совершенную пересылку для любой функции, а также специальную пересылку конструктора ("using A::A;").

2 голосов
/ 22 сентября 2009

Я копался в STL и, основываясь на том, что нашел, остановился на этом коде:

template <class Data>
class Node : public Data {
public:

  template<typename... _Args>
  Node (_Args&&... __args) : Data (std::forward<_Args>(__args)...) {
  }

  // ...
};

Работает с командой:

g ++ -std = c ++ 0x -c code.cpp

1 голос
/ 22 сентября 2009

Взгляните на недавно вышедшую статью

Использование наследующих конструкторов C ++ 0x для сокращения кода Boilerplate в иерархиях классов

на

http://www.devx.com.

Это, вероятно, описывает решение вашей проблемы будущее .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...