объявление контейнера STL для хранения переменной типа шаблона - PullRequest
0 голосов
/ 28 ноября 2018

У меня есть класс, в котором есть член args, в котором хранятся std::string и std::type_index.

Функция шаблона setArgument() добавляет имя атрибута и его typeid вargs.

class OperationEntry:
{
    std::vector<std::pair<std::string, std::type_index>> args;

    template <class AttrType>
    inline OperationEntry& setArgument(const std::string& name)
    {
        args_.push_back({name, typeid(AttrType)});
        return *this;

    }

Я хочу расширить определение args до std::tuple и содержать дополнительное значение, которое будет заполнено в setArgument().Однако типом значения является тип шаблона AttrType.

Мой вопрос: как мне объявить args для хранения этого типа шаблона, так как я заранее не знаю тип '?

например - std::vector<std::tuple<std::string, std::type_index, AttrType>> args;

например setArgument() может добавить

"alpha", f, 3.3
"beta", i, 3

1 Ответ

0 голосов
/ 28 ноября 2018

Элементы вектора должны иметь определенный тип, поэтому вам нужно какой-то стирания типа.

Если типы, с которыми может быть создан экземпляр setArgument, действительно не связаны, вам нужен тип any.boost::any совместим с C ++ 11 и может быть заменен на std::any при переходе на C ++ 17.

std::vector<std::pair<std::string, std::type_index, boost::any>> args;

Если естьэто конечный список типов на выбор, вместо этого вы можете использовать variant (boost:: до C ++ 17, std:: после).

std::vector<std::pair<std::string, std::type_index, boost::variant<int, float, string/*, ...*/>>> args;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...