На мой взгляд, это дерьмовое ключевое слово ...
К сожалению, насколько я знаю, его нет в gcc, но тогда я могу просто не знать об этом.
Надлежащий способ C ++ справиться с этим - использовать Концепции, то есть адаптировать операции, выполняемые над типом, в зависимости от некоторых требований.
Как правило, это выполняется с traits
, а не с реальными концепциями, потому что его легче внедрить:
template <typename T>
struct has_dump: boost::mpl::false_ {};
А затем вы включаете дамп-типы, специализируя структуру has_dump
.
Самое простое - определить 3 метода, один для маршрутизации, два других для выполнения разных веток:
template <typename T>
void dump(T& t, boost::mpl::true_ const& dummy)
{
t.Dump();
}
template <typename T>
void dump(T& t, boost::mpl::false_ const& dummy)
{
std::cout << typeid(T).name() << " does not have Dump\n";
}
template <typename T>
void dump(T& t) { dump(t, has_dump<T>()); }
Другое использование типовых черт будет связано с enable_if
возможностями:
template <typename T>
typename boost::enable_if< has_dump<T> >::type dump(T& t)
{
t.Dump();
}
// disable_if exists too...
Здесь, вместо сообщения об ошибке во время выполнения, вы можете получить ошибку времени компиляции, если для типа не включен has_dump
, не уверенный, хотите ли вы.
Однако оба эти метода довольно громоздки, поскольку обнаружение не автоматизировано. Вот почему есть библиотека Boost.Concept.
Идея состоит в том, что проверка будет выполняться объектом Concept, созданным для проверки требований, и, таким образом, вам больше не нужно будет специализировать черты, которые облегчают разработку. Однако я всегда находил документацию Boost.Concept несколько недостающей.