Примечание. Это вопрос с ответом, чтобы документировать технику, которую другие могут найти полезной, и для того чтобы быть осведомленным о других & rsquo; даже лучшие решения. Не стесняйтесь добавлять критику или вопросы в качестве комментариев. Также не стесняйтесь добавлять дополнительные ответы.:)Суб > В некоторых моих кодах, а именно в заголовке rfc/cppx/text/String.h
, я нашел следующий таинственный фрагмент:
template< class S, class enable = CPPX_IF_( Is_a_< String, S > ) >
void operator! ( S const& )
{ string_detail::Meaningless::operation(); }
operator!
поддерживает класс String
, который имеет неявное преобразование в исходный указатель. Поэтому я перегружаю (среди прочих) operator!
для этого класса и производных классов, так что непреднамеренное использование не поддерживаемого оператора даст подходящую ошибку компиляции, отметив, что это бессмысленно и недоступно. Я думаю, что гораздо предпочтительнее такого использования, которое тихо принимается с неожиданным, неправильным результатом.
Макрос CPPX_IF_
поддерживает Visual С++ 12.0 (2013) и более ранние версии, который обнаруживает, что С++ 11 using
находится в основном за его пределами. Для более стандартного компилятора я бы написал just & hellip;
template< class S, class enable = If_< Is_a_< String, S > > >
void operator! ( S const& )
{ string_detail::Meaningless::operation(); }
Это выглядит как std::enable_if
,
template< class S, class enabled = typename std::enable_if< Is_a_< String, S >::value, void >::type >
void operator! ( S const& )
{ string_detail::Meaningless::operation(); }
за исключением того, что If_
или CPPX_IF_
и его выражение гораздо более кратки и понятны.
Как я это сделал на Земле?