setParams для родственной иерархии классов с Variadic Templates
От: gencoder  
Дата: 28.04.17 13:06
Оценка:
Имеется иерархия классов, в которой A — базовый, B — потомок. У A есть защищенное поле m_i, а у B добавляется защищенное поле m_j. Требуется написать метод setParams такой, что при использовании экземпляра класса из разрабатываемой иерархии, он будет принимать правильные параметры и правильно их устанавливать. Т.е. для объекта класса A пример одно значение и установит поле m_i, а для B примет два значения и установит поля m_i и m_j:
A<int>* ptr = new B<int>;
ptr->setParams(1,2); // m_i=1, m_j=2 

A<int>* ptr = new A<int>;
ptr->setParams(3); // m_i=3


моя не очень удачная попытка http://ideone.com/mataBZ


template<class T>
class A {
protected:
    T m_i;
    virtual void m_set(T i) 
    {
        m_i=i;
    };
public:    
    template<typename ... Args>
    void setParams( Args&&... params ) 
    { 
        m_set(std::forward<Args>(params)...); 
    }
    virtual void show()
    { 
        cout << m_i << endl;
    }
};


template<class T, typename ... args>
class B: public A<T> {
protected:
    using A<T>::m_i;
    T m_j;
    virtual void m_set(T i, T j) 
    {
        m_i=i;
        m_j=j;
    }
public:    
    virtual void show() override 
    { 
        cout << m_i << ':' << m_j << endl;
    } 
};


int main() {
    auto a = new A<int>;
    a->setParams(22);
    a->show();
    
    A<int>* b = new B<int>;
    a->setParams(22,23);
    a->show();

    return 0;
}
c++11 variadic template
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.