首页 > 解决方案 > 将 boost 变体与包含 bool 输入的 std::functions 一起使用

问题描述

请参阅以下代码:

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,但反之亦然。为什么没有发生完全匹配?我可以强制比赛吗?

谢谢,

瑞安

标签: c++functionpointersboostvariant

解决方案


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

因此,它与任何一种变体类型都同样匹配。

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

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

推荐阅读