2015-01-20 4 views
2

У меня есть класс, который использует параметры вариационного типа, которые могут быть известны только во время выполнения, когда пользователь вводит ввод. Параметры типа должны быть только int или string и должны быть 1 или много (из-за чего есть Key and Ключи).Получение параметров типа во время выполнения

using namespace std; 

using Column = boost::variant<vector<int>, vector<string>>; 
using Columns = vector<Column>; 

namespace db { 
    template <typename Key, typename... Keys> 
    class KeyedTable { 
    public: 
     KeyedTable(const string& name); 

     template<typename V> 
     void add(const int pos, const V val, Key k1, Keys... keys); 

     string toString(); 
    private: 
     string name; 
     vector<string> colNames; 
     map<tuple<Key, Keys...>, Columns> data; 
    }; 
} 

я должен создать экземпляр этого класса из vector<Expr>, где каждый Expr представляет параметр типа и длину vector представляет число параметров типа, необходимое:

class Expr {} 

class IntExpr : public Expr {public: int i;} 

class StringExpr : public Expr {public: string s;} 

Что лучшее решение работать с этим классом, когда тип и количество параметров типа известны только во время выполнения?

+2

Вариадические шаблоны и вычеты типа времени исполнения для меня немного противоречивы. –

+1

Копировать компилятор C++, использовать пользовательский ввод для генерации кода на C++, скомпилировать указанный код и запустить его? (это также может быть худшим способом решения вашей проблемы) – Yakk

ответ

0

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

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

Что бы вы ожидали, если ваш вход имел нулевые ключи?

Думаю, вам понадобится что-то вроде map<vector<KeyType>, Columns> data. У вас уже есть вектор для Columns, поэтому он даже выглядит несколько естественным.

Смежные вопросы