Класс со многими параметрами шаблона 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), компилируется и в порядке, но я не знаю, как разрешить указывать распределитель для каждого типа а не для всего класса.
Есть идеи?