Класс со многими параметрами шаблона STL - использовать один распределитель или несколько?

Я пишу класс JSON для C++11, см. http://github.com/nlohmann/json. Моя центральная структура данных - это класс, упаковывающий типы значений JSON (null, массив, объект, строка, bool, число) в объединение и предлагающий его через приятный C++ и STL-подобный интерфейс. Типы для значений могут быть установлены через параметры шаблона и по умолчанию std::vector для массивов, std::map для объектов, std::string для струнных, bool для логических значений, int64_t для целых чисел и double для чисел плавающего типа.

Чтобы поддержать концепцию AllocatorAwareContainer, я также разрешил передавать тип распределителя, который по умолчанию равен std::allocator, Поскольку типы массивов, объектов и строк хранятся с указателями в моем объединении, я использую этот распределитель для выделения памяти для этих типов.

Пока все хорошо (см. https://github.com/nlohmann/json/blob/master/src/json.hpp для полного исходного кода)...

Теперь мой вопрос заключается в том, имеет ли смысл передавать распределитель, который затем неявно используется для массива типов, объекта и строки. В качестве альтернативы, я мог бы настроить распределитель, передав распределитель с конкретным типом std::map, std::vector, а также std::string, Затем, однако, я должен иметь возможность указать эту специализацию, потому что в настоящее время мой класс использует следующее определение для шаблонов:

template <
    template<typename U, typename V, typename... Args> class ObjectType = std::map,
    template<typename U, typename... Args> class ArrayType = std::vector,
    class StringType = std::string,
    class BooleanType = bool,
    class NumberIntegerType = int64_t,
    class NumberFloatType = double,
    template<typename U> class AllocatorType = std::allocator
    >
class basic_json

Проблема в том, что ArrayType должен быть std::vector<basic_json>, но конкретный тип basic_json еще предстоит определить. Еще хуже, ObjectType должно быть отображение из StringType в basic_json, Код, показанный здесь (и полностью найденный здесь https://github.com/nlohmann/json/blob/master/src/json.hpp), компилируется и в порядке, но я не знаю, как разрешить указывать распределитель для каждого типа а не для всего класса.

Есть идеи?

0 ответов

Другие вопросы по тегам