Есть ли способ использовать SFINAE, чтобы определить, не вызовет ли вызов шаблонной функции из-за предоставленных типов? - PullRequest
4 голосов
/ 12 января 2012

У меня есть шаблонный класс, который я использую для предоставления метода, который будет использовать boost::lexical_cast для приведения его параметров std::string к типу, указанному в шаблоне, только если возможно лексическое приведение.В настоящее время, чтобы проверить, возможно ли это, я просто проверяю, определено ли operator>> для рассматриваемого типа.Вот надуманный пример, который в основном иллюстрирует то, что я делаю:

template <typename ArgType, class Enable = void>
MyHelperClass
{
   void Foo (ArgType arg&, std::string strArg) { } // not castable; do nothing
};

template <typename ArgType>
MyHelperClass<ArgType, boost::enable_if<boost::has_right_shift<std::istream, ArgType> >::type>
{
   void Foo (ArgType arg&, std::string strArg) {
      arg = boost::lexical_cast<ArgType>(strArg); // cast string arg to ArgType
   }
};

До сих пор это прекрасно работает для моего кода: все типы, которые не пройдут лексическое приведение, заканчиваются первой версией и вседругие заканчивают вторым, по крайней мере для типов, в которых мой код использует это.Что меня беспокоит, так это то, что я в основном делаю предположение, что, пока целевым типом является InputStreamable, lexical_cast не будет работать.В документации boost для lexical_cast изложены некоторые другие требования, которые я, вероятно, должен также проверять, но вместо того, чтобы создавать комплекс enable-if и использовать mpl::and_, чтобы связать воедино кучу этих условий, мне было интересно: есть ли способ использовать SFINAE, чтобы просто напрямую проверить, будет ли этот вызов lexical_cast завершаться с ошибкой для указанных типов, и соответствовать специализированному шаблону, только если он не выйдет из строя?

Я только когда-либовидел примеры для проверки существования функции или оператора, но никогда не проверял, вызовет ли вызов шаблонной функции с данным типом ошибку.

1 Ответ

1 голос
/ 12 января 2012

Боюсь, что нет. Поскольку lexical_cast определен для всех T, SFINAE вам не поможет. Тот факт, что тело lexical_cast () не может быть скомпилировано для определенных типов, не вызывает сбоя подстановки. Лучшее, что вы можете сделать, - это попытаться предсказать условия, которые приведут к выходу организма из строя, как вы уже это делали.

...