При использовании утиной печати во время компиляции, присущей стилю шаблона, есть ли способ принудительно требование, чтобы аргумент шаблона реализовывал определенные методы с определенными сигнатурами?
struct ProtocolT {
void g() const;
void h();
}
// I want the compiler to check that T conforms to ProtocolT
// that is, T must implement g() and h() rather than just g()
template <typename T>
void f(const T& x) {
x.g();
}
Конечно, и без этого безупречная безопасность типов: если аргумент шаблона T
не имеет метода, используемого в реализации функции шаблона, компилятор всегда будет жаловаться.
Но я считаю привлекательным четко заявить, что class T
должен иметь все методы, указанные в каком-то class ProtocolT
. Это позволило бы мне ограничить дизайн на ранних этапах процесса разработки, потребовав методы из T
, которые я еще не использую в реализации функции шаблона.
Даже если бы я не включил неиспользуемые методы в ProtocolT
, я все же думаю, что проверенное соответствие протоколу поможет, когда мне нужно будет написать класс, пригодный для использования как T
. (Конечно, никто не мешает мне написать ProtocolT
для документации, но тогда компилятор не будет проверять, что ProtocolT
включает в себя по крайней мере все необходимые методы.)
ProtocolT
для обеспечения реализации, а затем SFINAE изT
. - person Hatted Rooster   schedule 04.07.2017