使用包含布尔输入的 std::functions 的升压变体

Using boost variant with std::functions containing a bool input

见以下代码:

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
}

我收到关于不明确过载的错误。似乎 stringPtrFunc 可以转换为 boolFunc,但反之则不行。为什么没有发生完全匹配?我可以强制匹配吗?

谢谢,

瑞安

问题是 &boolFunc 不是 std::function(任何类型),它是一个函数指针。因此,它可以转换为与之兼容的任何 std::function,但没有一个比其他任何一个更好。特别是,由于任何指针类型都可以隐式转换为 bool,因此 &boolFunc 可以转换为任何指针类型的 std::function<void(T *)>

因此,它与任一变体类型的匹配度都一样。

为避免这种情况,您需要明确说明您想要哪个 std::function

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