У меня есть шаблонный класс, который я использую для предоставления метода, который будет использовать 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
завершаться с ошибкой для указанных типов, и соответствовать специализированному шаблону, только если он не выйдет из строя?
Я только когда-либовидел примеры для проверки существования функции или оператора, но никогда не проверял, вызовет ли вызов шаблонной функции с данным типом ошибку.