Есть ли эквивалент для __if_exists в gnu c ++? - PullRequest
8 голосов
/ 23 сентября 2010

__ if_exists - это ключевое слово для Microsoft, предназначенное для проверки существования идентификаторов во время компиляции:

MSDN: __ if_exists

Он может быть очень полезен при «поддельной» специализации шаблонов, поскольку в некоторых случаях он обеспечивает намного более простой, читаемый и более эффективный способ, чем другие методы, такие как «настоящая» специализация или перегрузка или что-то еще.

Но теперь мне нужно перенести большой проект на gnu c ++, и я думаю, что я бы немного заплакал, если бы мне пришлось искать другие способы (по общему признанию) случаев, когда я его использовал

1 Ответ

5 голосов
/ 23 сентября 2010

На мой взгляд, это дерьмовое ключевое слово ...

К сожалению, насколько я знаю, его нет в 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 несколько недостающей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...