将 boost 变体与包含 bool 输入的 std::functions 一起使用
Posted
技术标签:
【中文标题】将 boost 变体与包含 bool 输入的 std::functions 一起使用【英文标题】:Using boost variant with std::functions containing a bool input 【发布时间】:2020-05-01 22:20:53 【问题描述】:见以下代码:
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,但反之亦然。为什么没有发生完全匹配?我可以强制匹配吗?
谢谢,
瑞恩
【问题讨论】:
这段代码不编译 - 一个错字。我的编译器报告:“错误:不能将‘::main’声明为全局变量”myVariant = std::function<void(const bool)>(&boolFunc);
?
【参考方案1】:
问题在于&boolFunc
不是std::function
(任何类型),它是一个函数指针。因此,它可以转换为任何与之兼容的std::function
,但没有一个比其他任何一个更好。特别是,由于任何指针类型都可以隐式转换为 bool,&boolFunc
可以转换为任何指针类型的std::function<void(T *)>
。
因此,它与任何一种变体类型都同样匹配。
为避免这种情况,您需要明确说明您想要哪个std::function
:
myVariant = std::function<void(const bool)>(&boolFunc);
【讨论】:
以上是关于将 boost 变体与包含 bool 输入的 std::functions 一起使用的主要内容,如果未能解决你的问题,请参考以下文章
Boost mpl::list 变体序列化 check_const_loading() 编译错误
boost::variant - 为啥“const char*”转换为“bool”?
构造一个包含变体类型索引中第 n 个类型值的 boost 变体?