Создайте класс шаблона на основе логического значения времени выполнения

Как я могу реализовать ниже? Я хотел бы «предварительно создать» 2 экземпляра класса шаблона «Doer» для логических значений. Я застрял с виртуалами? что было бы наиболее эффективным способом сделать что-то подобное? Я знаю о варианте повышения, но не уверен, что это лучше всего использовать? По сути, я хотел бы иметь 2 шаблона «Doer» для значений bool, так как разные члены doer будут выполнять разные действия в зависимости от значения bool.

struct Config
{
   int y;
};

template<typename DoerT>
class Aspect
{
   public:
         Aspect(bool b)
         {
            if(b) //can I create this way and pass around?
                _doer<true>(this);
            else 
                _doer<false>(this);
         }

         //will this work?
         DoerT doer() const { return _doer;}

   private:
     DoerT _doer;
};


template<typename ConfigT, bool b>
class Doer
{
  public:
    //how to create typedef for Aspect and objects that need "b"
        typedef Aspect<Doer<ConfigT,b> >* AspectT;

        //also can I then specialize member functions of OtherObject
        ///based on b?   There will be several other types here that
        //will need to perform tasks differently based on the bool.
        typedef OtherObject<ConfigT,b> OOT;

        Doer(AspectT asp) : _asp(asp) {}
        void doSomething(const Data& d) 
        {
        }

  private:
        AspectT _asp;
        OOT _obj;
};
//specialized members of Doer that need to behave differently based
//on bool..
template<Config,true>  template<> Doer::doSomething {..}
template<Config,false> template<> Doer::doSomething {..}



template<typename DoerT>
class Manager
{
   public:
         typedef Aspect<DoerT>* AspectPtr;

         void Load()
         {
            //retrieves data from database isNew returns bool
            Data dbData = GetDataFromDB();
            for(auto d : dbData)
            {
               //pass Boolean value to Aspect to create Doer templates
               rows[dbData.Name]= new AspectPtr<DoerT>(d.IsNew());
            }

         }
         AspectPtr Find(const std::string& name)
     {
    return rows[name];   
     }

  private:
        std::map<std::string,AspectPtr> rows;

};


class MXProcessor : Processor<Doer<Config, bool> > {...}


template<typename DoerT>
class Processor
{
   public:
      typedef Aspect<DoerT>* AspectPtr;
      typedef OtherObject1<DoerT>  obj1;
  typedef OtherObject2<DoerT>  obj2;
      void start()
      {
           _mgr.Load();
      } 
      void processData(const Data& d)
      {
            //lookup context row
            AspectPtr asp = _ctxMgr.Find(d.Name);
            asp->doer().doSomething(d);
      }

  private:
      Manager<DoerT>  _mgr;
      LogMgr<DoerT>  _lmgr;
};

int main() { //start MXProcessors}

person ggs    schedule 29.08.2015    source источник
comment
Это выглядит довольно круглым. Можете ли вы вообще упростить пример псевдокода?   -  person aschepler    schedule 29.08.2015
comment
Я попробую... то, что я пытаюсь сделать, это предварительно создать шаблоны Doer для bool, поэтому членам Doer (функции и другие классы со своими собственными функциями) не нужно постоянно проверять if(true), else {} .. Я должен быть в состоянии получить от Doer и использовать виртуальные, но мне интересно, есть ли лучший способ справиться только с двумя возможными значениями времени выполнения.   -  person ggs    schedule 29.08.2015
comment
Трудно понять, чего вы пытаетесь достичь. Почему bool должен быть параметром шаблона? различные члены doer будут выполнять разные действия в зависимости от логического значения, которое не объясняет этого. если вы беспокоитесь о стоимости повторной проверки логического значения во время выполнения, вы можете иметь в виду, что вы выиграете от предсказания ветвлений. если вы сделаете bool параметром шаблона, а затем сделаете вариант повышения на основе двух типов... это немного закольцовывается. почему бы не отказаться от шаблона, сделать что-то компилируемое, а потом попытаться оптимизировать.   -  person Chris Beck    schedule 29.08.2015
comment
Ваша программа имеет более одного экземпляра Doer?   -  person Yakk - Adam Nevraumont    schedule 29.08.2015
comment
Да.. Я только что обновил код. Аспекты создаются на основе того, что возвращается в базу данных. Процессоры MX находятся в выделенных потоках. Каждый MXProcessor использует Manager для создания аспектов. Каждый аспект имеет один и тот же тип исполнителя. У исполнителей есть много объектов, которые теперь должны вести себя по-разному в зависимости от логического значения. Я должен был бы добавить if/else во многих местах, и есть много частых событий.   -  person ggs    schedule 29.08.2015


Ответы (1)


Шаблоны представляют собой конструкцию времени компиляции. Вы не можете ожидать, что C++ сделает это из коробки.

На самом деле это возможно, используя генерацию кода, самоанализ (также недоступный в C++), компиляцию и динамическую компоновку. Но вам придется сделать это самостоятельно. Это не на языке. Это будет не так тривиально, как шаблон.

person dtech    schedule 29.08.2015