Как я могу заставить конструктор класса обращаться к перегруженной функции на основе аргумента? - PullRequest
0 голосов
/ 29 марта 2020

У меня есть следующий сценарий: класс internalEntity должен хранить данные в различных формах (например, boolCloud, std::vector<TRIANGLE> и т. Д. c.). При создании этого объекта конструктор должен вызывать правильную функцию initEntity() на основе аргументов. Как это можно сделать без перегрузки конструктора и функций?

Например, при выполнении

internalEntity myEntity(bCloud, "My bool Cloud");

, где bCloud - это boolCloud я хочу первая функция initEntity(), которую нужно вызвать.

Этот пример не работает, но часть typename T должна проиллюстрировать то, что я хочу сделать.

class internalEntity
{
public:
    internalEntity(typename T, std::string name) { initEntity(T, name); };

    void initEntity(boolCloud& bCloud, std::string name);
    void initEntity(std::vector<TRIANGLE>& triMesh, std::string name);
    void initEntity(std::vector<dvec>& pointCloud , std::string name);

    void deleteEntity();

    //...


};

1 Ответ

0 голосов
/ 29 марта 2020

Стандартное решение для этой ситуации использует вспомогательный класс:

template<typename T> struct initialize_me;

class internalEntity
{
public:
    internalEntity(typename T, std::string name)
    {
        initialize_me<T>::please(*this, name };

// ... The rest of the class declaration.

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

template<> struct initialize_me<bool> {

    inline static void please(internalEntity *me, const std::string &name)
    {
          boolCloud whatever_this_is;

          me->initEntity(whatever_this_is, name);
    }
};

И аналогично для любой другой необходимой специализации. Из вашего вопроса непонятно, откуда берется первый параметр для перегруженных initEntity. Если они являются членами одного класса, они могут быть переданы здесь через указатель me, как правило. Если необходимо, чтобы ограничить доступ, вспомогательный класс может быть friend.

. Он становится немного более точным, если инициализация должна произойти в секции инициализации конструктора, и не может быть передана в тело. как в этой ситуации. Тогда решение будет зависеть от точных деталей, и конкретный пример, например c, потребуется, прежде чем выяснить решение.

...