Без полного понимания того, что вы ищете (я запутался в последней части, касающейся конструкторов), я думаю, что вы, возможно, слишком усердно пытаетесь упростить синтаксис для своих клиентов.
...как насчет просто:
class A {
public:
enum Value {val1, val2, val3, val4, etc};
bool write(Value val);
};
Хорошо, что вы пытаетесь установить более простой синтаксис, но вы также должны избегать опасности монолитизма.Я уверен, что монолитные классы - это одна из самых распространенных ошибок в объектно-ориентированном дизайне.Саттер подробно расскажет об этом в C++ Coding Standards
и на гтв: http://www.gotw.ca/gotw/084.htm.
Если у вас есть класс с 100 функциями-членами, у вас, вероятно, их около 80.
^ Подумайте над этим утверждением некоторое время.Когда у вас так много функций, вашими классами становится все труднее управлять.Он также предлагает другим разработчикам просто добавлять все больше и больше в ваш класс, чтобы его дизайн никогда не завершался.В результате получается бесконечный класс, который просто растет и растет с каждым циклом разработки без конца.Это может легко стать источником ошибок, неэффективности, постоянных ревизий открытого интерфейса, поломок модульных тестов, и это может пойти вразрез с общим повторным использованием и гибкостью вашего класса.Когда у вас есть отдельная функция для каждого значения, которую вы можете передать другой функции, вы опасно наступаете на эту территорию.
Попытка слишком сильно избежать синтаксической избыточности обычно является ошибкой.К сожалению, в некоторых случаях C ++ требует более продолжительного синтаксиса (становится намного лучше с C ++ 11).То, что вы должны попытаться оптимизировать, это логическая избыточность .Здесь вызов метода записи с различными значениями не требует никакой логической избыточности, и синтаксические издержки едва ли превышают вызов различных функций для каждого значения, которое вы можете передать для записи.
Если эти функции не делают ничего, кроме упрощения синтаксисапередавая различные значения, вы должны осознать, что вы также раздувает открытый интерфейс класса с гораздо большим количеством функций, которые, если вы находитесь в производственной среде, вам, вероятно, придется документировать и обучать индивидуально.Стремитесь делать больше с меньшими затратами, и я думаю, что вам будет намного лучше.
Постарайтесь помнить об этом аспекте монолитизма как о приоритете.Вы могли бы даже пойти так далеко, чтобы вывести именованные константы из определения класса как не-члены, например так:
class A {
bool write(uint32_t address);
};
// elsewhere
static const uint32_t address_val1 = ...;
static const uint32_t address_val2 = ...;
static const uint32_t address_val3 = ...;
В этом дизайне нет ничего плохого, и, на самом деле, он более желателентехнические характеристики, отличные от тех, в которых у вас больше учеников, так как он полностью отделен от вашего класса, что упрощает обслуживание этого класса, упрощает его интерфейс для обучения и документирования и повышает вероятность достижения состояния разумного завершения.