У меня есть небольшой класс C ++, который упаковывает информацию о типах для некоторых основных типов;упрощенная версия выглядит следующим образом:
struct TypeInfo {
TypeInfo(std::size_t elm_size, const std::string& type_name) :
elm_size(elm_size),
type_name(type_name)
{}
std::size_t elm_size;
std::string type_name;
}
TypeInfo double_info(sizeof double, "double");
TypeInfo int_info(sizeof int, "int");
Это работает, но я бы хотел иметь возможность создания экземпляра объекта TypeInfo
на основе нормальных шаблонов C ++;то есть что-то вроде этого:
TypeInfo<double> double_info; // <- This does not work
Поскольку класс как таковой не содержит никакого T
- это на самом деле не шаблонный класс, а скорее удобный метод создания экземпляров.Когда это содержится в действительно шаблонной функции:
void vector_operation(const std::vector<T>& data) {
TypeInfo<T> type_info; // <- This does not work!
}
, было бы действительно полезно, если бы я мог создать экземпляр TypeInfo
на основе параметра шаблона.Так как мне нужно охватить лишь несколько фундаментальных типов - float, double, int
и char
, я был бы более чем рад специализовать несколько типов явно.
Обновление : @nathan_oliver предложил сделать класс в целом шаблоном, а затем использовать sizeof(T)
для определения размера элемента.Проблема с этим решением (как я его вижу) - это то, что пользователю все еще нужно предоставить строку type_name
(и некоторую дополнительную информацию о типе) - я хотел бы специализировать несколько нужных мне типов - и затем полностью указать:
template <typename T>
struct TypeInfo {
TypeInfo();
std::size_t elm_size;
std::string type_name;
}
А затем в файле .cpp:
template<>
TypeInfo::TypeInfo<double>() {
this->elm_size = sizeof(double);
this->type_name = "double";
}
template<>
TypeInfo::TypeInfo<int>() {
this->elm_size = sizeof(int);
this->type_name = "int";
}
, но это даже не компилируется:
type_info.cpp:46:5: error:
invalid use of template-name ‘TypeInfo’ without an argument list
TypeInfo::TypeInfo()