«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Влияет ли аргумент шаблона `std::function` на его тип во время построения объекта?

Влияет ли аргумент шаблона `std::function` на его тип во время построения объекта?

Опубликовано 13 декабря 2024 г.
Просматривать:864

Does the Template Argument of `std::function` Influence its Type During Object Construction?

Включен ли аргумент шаблона std::function в его тип?

Введение в проблему

При использовании шаблона std::function возникает неоднозначность может возникнуть из-за множественных возможных перегрузок. В частности, рассмотрим следующий фрагмент кода:

#include 

using namespace std;

int a(const function& f) { return f(); }
int a(const function& f) { return f(0); }
int x() { return 22; }
int y(int) { return 44; }

int main() {
    a(x); // Call is ambiguous.
    a(y); // Call is ambiguous.
}

Неоднозначность возникает из-за того, что и function, и function могут быть созданы из указателя универсальной функции. Это приводит к появлению нескольких потенциальных совпадений для перегрузок функции a.

Разрешение неоднозначности

Сигнатура аргумента шаблона для std::function считается частью ее типа во время объявления и определения. Однако во время создания объекта это не так.

std::function, как и многие функциональные объекты в C, использует технику, называемую стиранием типа. Это позволяет ему принимать произвольные объекты или функции, если они соответствуют ожидаемой сигнатуре при вызове. Обратной стороной является то, что ошибки, связанные с несовпадающими подписями, возникают глубоко внутри реализации, а не на уровне конструктора.

Обход неоднозначности

Существуют три основных варианта обхода этой двусмысленности:

  • Явное приведение типов: вручную приведите указатели функций к конкретной сигнатуре, требуемой предполагаемым перегрузка.
  • Обертка объекта функции: создайте объект функции соответствующего типа и передайте его вместо него.
  • Метапрограммирование шаблонов (TMP): используйте TMP для генерации функции с нужной сигнатурой, избегая явного casts.

Заключение

Хотя аргумент шаблона std::function действительно определяет его тип во время объявлений и определений, он не играет никакой роли в построении объекта. Это может привести к неоднозначности, когда конструкторы принимают произвольные аргументы. Чтобы решить эту проблему, программисты могут использовать явное приведение типов, перенос функциональных объектов или TMP.

Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3