使用包含布尔输入的 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);
见以下代码:
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);