将 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&lt;void(const bool)&gt;(&amp;boolFunc);? 【参考方案1】:

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

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

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

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

【讨论】:

以上是关于将 boost 变体与包含 bool 输入的 std::functions 一起使用的主要内容,如果未能解决你的问题,请参考以下文章

如何简化 boost 变体的加号操作?

Boost mpl::list 变体序列化 check_const_loading() 编译错误

boost::variant - 为啥“const char*”转换为“bool”?

构造一个包含变体类型索引中第 n 个类型值的 boost 变体?

boost::variant 将 static_visitor 应用于某些类型

boost 变体可以安全地与指向前向声明类的指针一起使用吗?