Указатели на функции позволяют ссылаться на определенные операторские функции. Однако для встроенных стандартных операторов этот подход может быть непростым. В этой статье рассматриваются причины этого ограничения и исследуются альтернативные решения для достижения аналогичной функциональности.
Согласно стандарту C (13.6/ 1), встроенные операторы не являются обычными операторными функциями и, следовательно, не могут иметь указателей на функции. Они участвуют исключительно в разрешении перегрузки и не служат какой-либо другой цели.
Чтобы преодолеть это ограничение, стандарт C вводит функциональные объекты, которые обеспечивают функциональность, аналогичную встроенным функциям. операторы через шаблонные объекты. Например, для сравнения определяются такие функциональные объекты, как «equal_to», «greater» и «less_equal». Эти объекты можно использовать в качестве аргументов указателя функции.
В представленном фрагменте кода целью является сравнение двух целых чисел в классе шаблона. Используя технику объектов-функций, этого можно добиться следующим образом:
class MyAction {
bool operator()() {
if (fnCompare_(arg0_, arg1_)) {
// do this
} else {
// do s.th. else
}
}
};
Здесь fnCompare_ может быть объектом функции, например std::equal_to
В дополнение к объектам функции операторы стандартной библиотеки также могут использоваться в качестве указателей на функции. Однако необходимо указать соответствующий экземпляр шаблона. Например:
std::basic_string a("test"), b("test2");
std::cout >(a, b, &std::operator );
Хотя указатели функций не доступны напрямую для встроенных в стандартных операторах альтернативные решения, предоставляемые функциональными объектами и операторами стандартного типа класса, обеспечивают эквивалентную функциональность. Эти альтернативы позволяют использовать определенные стандартные операторы в качестве указателей на функции, устраняя ограничения, налагаемые встроенными операторами.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3