Как избежать использования CRTP Любопытно повторяющийся шаблон шаблона для обеспечения возможности совместного использования функций - PullRequest
0 голосов
/ 28 августа 2018

Я унаследовал обслуживание программы печати, которая использует CRTP ( Любопытно повторяющийся шаблон ) включить совместное использование производных функций между классами для разных измерений.

Но хотя использование derived().my_funct() работает на всех компиляторах, оно спутывает Visual Studio Intellisense и отладку, а также Doxygen, поэтому я бы хотел прекратить использовать это в будущем.

Скелетная программа ниже иллюстрирует, что я хочу сделать.

Суть проблемы заключается в сотнях небольших функций для установки характеристик, которые являются общими для всех измерений - кроме ссылки svg1& или svg2, позволяющей связывать с return *this.

Я мог бы создать два включаемых файла, которые отличаются только svg&, но это было бы не элегантно и стало кошмаром обслуживания.

Предложения приветствуются.

//svg2.hpp

  #include <string>

  class svg1;
  class svg2;

  class svg1
  {
  public:
    static const int dim_ = 1;
    int size_ = 0;
    std::string title_;
    svg1(std::string title = "title")
    {
      title_ = title;
    }

    svg1& size(int s)   // Note svg1&
    {
      size_ = s;
      return *this; // Chainable.
    }

    // There are nearly 300 more chainable functions like size.

  }; // class svg1

  class svg2
  {
  public:
    static const int dim_ = 2;
    int size_ = 0;
    std::string title_;
    svg2(std::string title = "title")
    {
      title_ = title;
    }

    svg2& size(int s)   // Note svg2&, otherwise identical, so want to avoid duplicating hundreds of functions!
    {
      size_ = s;
      return *this; // Chainable.
    }
  }; // class svg2



  #include <string>

  #include "svg2.hpp"

  int main()
  {
    svg1 plot1("my_1D_title");
    plot1.size(99);

    svg2 plot2("my_2D_title");
    plot2.size(99);

    return 0;
  }
...