std :: vector of пары с разными типами - PullRequest
0 голосов
/ 18 июня 2020

Я пытаюсь создать небольшую интерфейсную функцию и отправить ее в класс форматирования JSON. JSON работает только с (неограниченными) парами ключ-значение, но значение может быть (только): string, int, bool

Теперь у меня есть:

struct Data
{   
    std::vector<std::pair<std::string, int64_t>> intData;
    std::vector<std::pair<std::string, std::string>> strData;
    std::vector<std::pair<std::string, bool>> boolData;
};

void func(const Data& data);

Но я не Мне это очень нравится (3 почти одинаковые структуры в Data), возможно, есть лучший способ C ++.

В идеале для меня было бы иметь что-то (шаблонное) более чистое и работать как:

// pseudocode, I know that it does not work

struct Data
{   // AnyType = string, int or bool
    std::vector<std::pair<std::string, AnyType>> data;
};

// or better
using Data = std::vector<std::pair<std::string, AnyType>> data;

Data data;
data.add("int value", 1);
data.add("string value", "str");
data.add("bool value", false);

func(data);

Спасибо

LE: Я использую C ++ 11, к сожалению, не могу использовать другой стандарт.

1 Ответ

3 голосов
/ 18 июня 2020

Одно из решений, которое приходит на ум, - использовать std::variant, чтобы получить время компиляции полиморфизм , ie.:

std::vector< std::pair<std::string, std::variant<int64_t, std::string, bool>>>;

С псевдонимом типа :

using json_val = std::variant<int64_t, std::string, bool>;
std::vector< std::pair<std::string, json_val>>;

Примечание о json и общем подходе:

Если вам не нужно промежуточно различать тип или, возможно, нельзя использовать вариант, может быть даже проще просто использовать std::string для всех типов значений. Поскольку это json, это может иметь смысл, поскольку формат данных json не имеет таких типов, как int64_t, ie. json просто имеют числа, которые представлены строками. (затем это распознается с помощью синтаксического анализа, который, я думаю, вы пытаетесь смоделировать в промежуточном формате).

...