Я хотел бы создать шаблон, который проверяет, является ли тип класса примитивным или нет (int, char, float, float ***, ect ...). Причина этого заключается в том, чтобы предотвратить попытку другого шаблона расширить примитивы и вызвать ошибку времени компиляции. До сих пор у меня есть что-то вроде:Создать шаблон is_primitive или is_inheritable
#include <typeinfo>
template<typename T>
struct is_primitive{
const static bool value=std::is_fundamental<T>::value;
};
Очевидно, что это просто форматирует результат is_fundamental прямо сейчас. Я хотел бы добавить remove_pointer, remove_reference, ect ..., чтобы удалить все эти дополнительные модификаторы входного класса. Что нужно сделать, чтобы сделать T максимально открытым?
В качестве альтернативы, решение как следующий будет столь же выдающимся:
template<typename T>
struct is_inheritable{
const static bool value=???;
};
Но я уверен, что множество uninheritable классов составляет множество примитивных классов.
звучит, как вы хотите [ 'is_fundamental'] (http://en.cppreference.com/w/cpp/types/ is_fundamental). Обратите внимание, что (как написано в вашем вопросе) тип класса никогда не является примитивным (фундаментальным), поскольку тип класса всегда вводится через 'class' или' struct'. – GManNickG
Ничего себе я не знаю, почему я это пропустил, но я не думаю, что он ловит все ссылки, части указателя и другие вещи, о которых я мог бы не знать (все еще довольно новый для реального мира C++). Я обновляю свой вопрос с помощью is_fundamental. – Suedocode
«baring» of 'T' обычно называется« Unqualified », и этого достаточно, чтобы связать' RemoveCv > '- ссылки не могут быть cv-квалификацией, поэтому они должны быть на верхнем уровне. У вас не может быть ссылок на ссылки или указатели на ссылки, поэтому опять же они должны быть на высшем уровне. После этого просто разделите cv-qualificaiton. (Cv-qual означает const и/или volatile-qualified.) –
Xeo