2015-09-07 2 views
0

На рабочем месте я работаю над продуктом, который понимает типы во время выполнения. Появилась задача, которая требует, чтобы я прочитал эти типы и сохранил их в классе C++ на основе того, какой конструктор вызывается. До сих пор я дал мысль о std::tuple, переменных числе шаблонов и std::vector из boost::any и я мог бы придумать что-то вродеСоздание экземпляра конструктора на основе времени выполнения

class Storage 
{ 
    private: 
     std::tuple<int,float,std::string> ti; 
    public: 
     Storage(....); 
     Storage(....); 
     ....   // constructors for all the combinations 
}; 

У нас есть внутренний API, который может сказать мне о том, сколько типов поставляются во время выполнения , однако проблема заключается в том, что я не знаю, каким образом будут поставляться элементы, т. е. может быть только один тип или более одного или всех трех и так далее.

Как таковой, я получаю большой блок блокировки коммутатора, где я проверяю возможности для всех входов (например, 1 тип, 2 типа и 3 типа).

Есть ли способ решить это? По некоторым шаблонам мета-программирования магии, что в конце концов я могу уйти от этого большого коммутационного футляра и просто предоставить один конструктор и дать возможность компилятору создать экземпляр конструктора на основе ввода.

Я прошел через this и this вопрос, но я не мог понять, как он подходит для моего использования.

+0

Ваша проблема заключается в порядке аргументации для построения 'ti'? – Jarod42

+1

Ваш вопрос непонятен; не могли бы вы описать, какой вход вы можете получить, и соответствующий результат, который вы ожидаете: псевдокод в порядке, но опишите ваше * намерение *. Кроме того, похоже, существует смешение вопросов: тип и количество элементов, которые решаются во время выполнения, являются ортогональными. Решение проблемы типа является сложной, в то время как время выполнения является равным для курса для 'vector'. –

+0

Поиск в Интернете для «фабрики программного обеспечения» или «отправки программного обеспечения». –

ответ

1

Набрав это наизусть. Если он не работает, я не знаю, кто его написал. Надеюсь, я правильно понял проблему.

Сделать вспомогательную структуру, которая имеет все три члена, а также три флага, которые устанавливаются, если соответствующие элементы установлены, а также перегруженная функция, которая устанавливает члены:

struct Helper 
{ 
    int i; 
    bool bi; 
    float f; 
    bool bf; 
    std::string s; 
    bool bs; 

    void set(int i) { this->i = i; bi = true; } 
    void set(float f) { this->f = f; bf = true; } 
    void set(std::string s) { this->s = s; bs = true; } 
}; 

сделать шаблон функции (на самом деле три такие шаблоны), которые занимают до 3-х параметров и возвращает объект Helper:

template<class P1, class P2, class P3> Helper make(P1 p1, P2 p2, P3 p3) 
{ 
    Helper h; 
    h.set(p1); 
    h.set(p2); 
    h.set(p3); 
    return h; 
} 

template<class P1, class P2> Helper make(P1 p1, P2 p2) 
{ 
    Helper h; 
    h.set(p1); 
    h.set(p2); 
    return h; 
} 

template<class P1> Helper make(P1 p1) 
{ 
    Helper h; 
    h.set(p1); 
    return h; 
} 

Ваш Storage класс должен иметь один конструктор с одним параметром типа Helper , и используйте только параметры, которые имеют установленный флаг. Использовать систему:

Storage storage = make(<any combination of up to 3 params>);