Передача параметра между двумя вариантами выбора классу - PullRequest
0 голосов
/ 27 июня 2018

Как я могу передать Объект типа Push или Pull в Объект типа Object Pool?

Я моделирую Object Pool в C ++. Я сделал функцию с именем Request(), которая может получить параметр либо Pull, либо Push.

Возможно ли это? И если да, то как?

Заранее спасибо .

<ч />

Вот пример кода:

template <class T>
class ObjectPool {
    public:
        T Request(T* Object) {
            // This is the part that seems unclear to me.
            // Basically, in Pseudocode it looks like:
            // if Object.type == Pull, then do:
            //     Steps to Generate an Object.
            // else if Object.type == Push:
            //     Steps to store an Object.
        }

        ObjectPool() {
        }

        ~ObjectPool() {
        }
}

Ответы [ 2 ]

0 голосов
/ 27 июня 2018

Если класс Pool настроен на параметр запроса:

У вас есть два варианта:

  1. Просто превратите свой псевдокод в код:

    T Request (T* Object) {
         static_assert(std::is_same_v<T,Push> or std::is_same_v<T,Pull>,
             "Unsupported pool element type");
         if constexpr (std::is_same_v<T,Pull>) {
             /* do stuff for Pulls */
         }
         else { // i.e. std::is_same_v<T,Push> {
             /* do stuff for Pushes */
         }
    };
    
  2. Не предоставляют общую реализацию, а скорее две специализации, для Pull и для Push соответственно.

    template <typename T>
    class Pool{
        /* ... */
        T Request (T* Object);
        /* ... */
    };
    
    template<> Pool<Pull>::Request(Pull* pull) { /* etc. */ }
    template<> Pool<Push>::Request(Push* push) { /* etc. */ }
    

Если класс Pool не задан в параметре запроса:

Вы должны быть более конкретны в своем вопросе, но:

  1. (как подсказывают @Tyker и @SomeProgrammerDude) вы можете перегрузить метод запроса:

    class Pool {
        /* ... */
        SomeType request(const Push& p);
        SomeType request(const Pull& p);
    };
    
  2. Вы можете шаблонировать метод запроса по типу запроса:

    class Pool {
        /* ... */
        template <typename T>
        SomeType request(const T& request_param);
    };
    
  3. Вы можете использовать вариант , где значения могут иметь либо один тип, либо другой тип - как (непересекающееся) объединение двух типов:

    class Pool {
        /* ... */
        using request_param_type = std::variant<Push, Pull>;
        template <typename T>
        SomeType request(request_param_type request_param);
    };
    

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

    Теперь приведенный выше код немного проблематичен, так как, как я его написал, вы делаете копию объекта Push или Pull и, возможно, не захотите этого делать. В этом случае попробуйте:

    template<class...Ts>
    using variant_of_const_refs = std::variant<std::reference_wrapper<const Ts>...>;
    
    class Pool {
        /* ... */
        using request_param_type = variant_of_const_refs<Push, Pull>;
        template <typename T>
        SomeType request(request_param_type request_param);
    }
    
0 голосов
/ 27 июня 2018

Вы можете сделать это по наследству, оба объекта Pull и Push наследуются от родительского класса.

class Push: public BaseClass { /* ... */ };
class Pull: public BaseClass { /* ... */ };

void Request(BaseClass* action) { /* ... */ }

Таким образом, вы можете дать объекту Pull или объект Push для вашей функции запроса.

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