Использование варианта boost с std :: functions, содержащим ввод bool - PullRequest
1 голос
/ 02 мая 2020

См. Следующий код:

void stringPtrFunc(const std::string *s) {}
void boolFunc(const bool b) {}

int main() {
    boost::variant<std::function<void(const std::string *)>, std::function<void(const bool)>> myVariant;

    myVariant = &stringPtrFunc; // Compiles fine
    myVariant = &boolFunc; // Error
}

Я получаю ошибку о неоднозначной перегрузке. Похоже, stringPtrFun c можно преобразовать в boolFun c, но не наоборот. Почему не происходит точное совпадение? Могу ли я форсировать матч?

Спасибо,

Райан

1 Ответ

1 голос
/ 02 мая 2020

Проблема в том, что &boolFunc - это не std::function (любого типа), это указатель на функцию. Как таковой, он может быть преобразован в любой std::function, с которым он совместим, но ни один из них не лучше, чем любой другой. В частности, поскольку любой тип указателя может быть неявно преобразован в bool, &boolFunc может преобразовать в std::function<void(T *)> для любого типа указателя.

В результате он одинаково хорошо соответствует любому варианту типа.

Чтобы избежать этого, вам нужно явно указать, какой std::function вы хотите:

myVariant = std::function<void(const bool)>(&boolFunc);
...