将boost变体与包含bool输入的std::函数一起使用



请参阅以下代码:

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,但不能反过来。为什么没有完全匹配?我可以强行比赛吗?

谢谢,

Ryan

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

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

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

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

最新更新