Одна трудная точка здесь - type * getData()
.Здесь вы либо возвращаете простой void *
и требуете, чтобы вызывающий объект выполнял явное приведение к нему, либо вам приходится использовать шаблонную функцию.
Короче говоря, вы изменили шаблонный класс (где перегрузка разрешается во время компиляции) для набора шаблонных методов и небольшого количества переключателей для разрешения некоторых функций во время выполнения.
Вы говорите , большинство классов используют класс матрицы, не заботясь отип данных .Это именно то, для чего созданы шаблоны: набор средств хранения и обработки, который не зависит от базового типа (хорошо шаблоны могут делать немного больше, но изначально были созданы для этого)
void *
всегдабезопасный указатель и отличный выбор для C-совместимых API.Но если у вас нет проблем с производительностью (шаблоны могут использовать слишком много памяти на крошечных системах, поскольку они объявляют разные классы для каждой реализации (*)) и могут доказать, что void *
лучше для конкретного случая использования, вам следует придерживатьсяобщие правила.Пишите простой и легкий для чтения код и оптимизируйте его только тогда, когда вы обнаружите узкое место.
После вашего редактирования я вижу, что вы хотите хранить матрицы разных базовых типов в одном контейнере.Я могу представить себе полиморфизм, если все матрицы могут быть производными от общего не шаблонного типа, но я не удивлюсь, если вы вдруг попадаете в проблему type * getData()
позже: вы статически приводите указатель void, поэтому компилятор имеетнет способа помешать вам сделать плохой актерский состав.Другой возможностью будет std::variant
для матриц (если C ++ 17) или boost::variant
или любой другой вариант или любой вариант.Некоторые из них реализуют приемы для предотвращения неудачных приведений во время выполнения.
Трудно понять, какой путь лучше, не экспериментируя с реальной проблемой ...
Некоторые другие языки, такие как Java, имеютне шаблонов (различный класс для каждой реализации), а обобщенных (общий класс, который действует на объектов ).Плюсы - это всего лишь один класс, поэтому вопрос о том, что правильный шаблон недоступен во время ссылки, исчез, минусы заключаются в том, что требуются некоторые приемы, чтобы сделать фактический тип доступным во время выполнения.