Двухфазный поиск: можно ли избежать "раздувания кода"?
Вопрос двухэтапного поиска: существует ли более синтетический способ написания этого кода, т.е. using
директивы? Что-то вроде using CBase<T>;
это то, что я хотел бы, но это не принято.
#include <iostream>
template <typename T>
class CBase
{
protected:
int a, b, c, d; // many more...
public:
CBase() {
a = 123; c = 0;
}
};
template <typename T>
class CDer : public CBase<T>
{
// using CBase<T>; // error, but this is what I would like
using CBase<T>::a;
using CBase<T>::b;
//...
public:
CDer() {
std::cout << a << this->c;
}
};
int main()
{
CDer<int> cd;
}
В моем реальном коде есть еще много переменных / функций-членов, и мне было интересно, можно ли каким-то образом написать более короткий код.
Конечно, используя this->c
синтаксис не решает проблему...
Спасибо!
gcc 4.1 MacOS X 10.6
2 ответа
I reduced the testcase and then consider three options
template<typename T> struct Base { int a; };
Опция 1
template<typename T> struct Der : Base<T> {
void f() {
int &ra = Der::a;
// now use ra
}
}
Вариант 2
template<typename T> struct Der : Base<T> {
void f() {
// use this->a instead
// or Der::a
}
}
Вариант 3
// use your using declarations
Не похоже, что большинство этих переменных параметризованы. Есть ли CBase
использовать их все или просто a
? Если нет, переместите их в новую не шаблонную базу CDer
,
Или упакуйте их все в структуру POD, а затем using CBase<T>::m_ints;
,
Решение с высокими накладными расходами: без шаблонов virtual
база.
Не уверен, но стоит попробовать: вложите определение CDer
внутри CBase
а потом typedef
это в область имен.