Двухфазный поиск: можно ли избежать «раздувания кода»? - PullRequest
3 голосов
/ 03 апреля 2010

Вопрос двухфазного поиска: Есть ли более синтетический способ написания этого кода, то есть избегая всех этих 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 не решает проблему ...

Спасибо'S!


gcc 4.1 MacOS X 10,6

Ответы [ 2 ]

2 голосов
/ 03 апреля 2010

Я уменьшил тестовый пример и затем рассмотрел три варианта

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
0 голосов
/ 03 апреля 2010

Не похоже, что большинство этих переменных параметризованы. CBase использует их всех или просто a? Если нет, переместите их в новую базу без шаблонов CDer.

Или, упакуйте их все в структуру POD и затем using CBase<T>::m_ints;.

Решение с высокими накладными расходами: без шаблонов virtual base.

Не уверен, но стоит попробовать: вложите определение CDer в CBase, а затем typedef в пространство имен.

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