Я пытаюсь написать общий компонент, который обрабатывает данные, идентифицируемые в настоящее время перечислением. Данные могут быть разных типов, но один идентификатор только одного типа.
То, чего я пытаюсь добиться, это специализировать шаблон где-нибудь в моей кодовой базе и вызывать функцию только по их идентификатору, например
Test::get<ID2>()
Что работает в приведенном ниже коде, включая тип. Есть ли простой / умный способ избежать написания типа в строке get?
Я пытался использовать typedef для идентификации, конечно, покупка, которая напрямую разрешается для примитивного типа, и две специализации шаблона неоднозначны. Если нет хорошего C ++ способа, я все еще могу использовать генерацию кода для решения этой проблемы, но я надеюсь на лучшее решение.
#include <iostream>
typedef int ID1_t;
typedef double ID2_t;
enum {
ID1,
ID2,
};
class Test
{
public:
template<int I, typename T> static T get();
};
template<> int Test::get<ID1>()
{
return 43;
}
template<> double Test::get<ID2>()
{
return 0.12;
}
int main()
{
std::cout << Test::get<ID2, ID2_t>() << std::endl;
std::cout << Test::get<ID1, ID1_t>() << std::endl;
}
РЕДАКТИРОВАТЬ (немного больше фона):
Я пишу центральный, чтобы использовать компонент для получения данных (например, int) и установить данные с помощью механизма уведомлений, чтобы проинформировать все необходимые места.
Его централизованно определенная, но децентрализованная реализация заключается в том, что интерфейс одинаков для всех целей, но реализация может быть в собственном исходном файле.
Это значительно уменьшает зависимости между компонентами, но также обеспечивает обмен типизированными данными.
Например:
Допустим, у нас есть данные, записанные во флэш-память во время производства, с данными конфигурации, хранящимися в EEPROM или FRAM, а также некоторые изменчивые данные в переменных RAM, которые будут забыты при цикле питания.
Давайте возьмем значение громкости для динамика, которое можно как-то изменить. Я просто хочу поместить значение в систему:
auto volume = 55; //(constant here but is in real decoded from SPI)
CentralDataStorage::set<Volume>(volume);
Я не хочу делать здесь зависимость от физического хранилища.
Чем я хочу компонент, который отвечает за хранение значения, а также возвращает значение по запросу. Таким образом, он реализует метод set и get, но только для идентификатора Volume .
Другой компонент, который фактически устанавливает громкость в усилителе, получает уведомление и использует метод get из центрального интерфейса, который реализован где-то, чего этот компонент не знает.
auto volume = CentralDataStorage::get<Volume>();
Все известно во время компиляции и должно быть безопасным для типа.