Я пытаюсь понять полезность static_assert
, и я хочу знать, может ли он помочь мне в обеспечении исполнения дизайна, и если да, то каким образом.Enforce template type via static_assert
У меня есть общий класс шаблонов, который скрывает свою собственную реализацию внутри другого класса шаблона, который частично специализируется на основе размера типа шаблона. Вот краткое описание этой конструкции:
template <class T, size_t S = sizeof(T)>
struct Helper;
template <class T>
struct Helper<T, sizeof(long)>
{
static T bar();
};
// ... other specializations ...
template <class T>
class Foo
{
public:
T bar()
{
return Helper<T>::bar();
}
};
Foo поддерживается только если размер T
поддерживается специализации Helper. Например, поддерживаются Foo<long>
и Foo<unsigned long>
. Однако предположим, что пользователь пытается построить Foo<bool>
. Как правило, это порождает ошибки, поскольку специализация Помощник для bool
не определен, что является предполагаемым поведением.
Есть ли способ использовать static_assert
в этом дизайне, чтобы предоставить пользователю более полезные ошибки для этого интерфейса?
Кроме того, я хотел бы также ограничить пользователя использованием определенного типа, хотя размер может быть правильным. Например, Foo<float>
не допускается. Прямо сейчас, единственный способ, которым я знаю, обеспечить это, - это смелый комментарий в документации. :)
Подумайте, в общем, это только целые типы, которые поддерживаются? Нет 'char',' bool', 'float', et al? – Rapptz
Поиск SO для ограничений типа шаблона или «понятий». Средство для этого было удалено с C++ 11 в последнюю минуту. Однако есть менее автоматические способы достижения подобных результатов. – luke
@Rapptz, 'char',' int' и 'long', а также их' unsigned' версии должны поддерживаться. Код будет идентичным для 'int',' long' и 'unsigned long', если' sizeof (int) == sizeof (long) == sizeof (unsigned long) '. – Zeenobit