c ++ overload:string literal与boost :: function ambiguity

den*_*nis 5 c++ string boost overloading function

我的问题代码:

#include <string>
#include <boost/function.hpp>

void func (const std::string&) {}
void func (const boost::function<void()>&) {}

int main() {
    func (main); // good
    func ("bad");
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

=>

error: call of overloaded ‘func(const char [4])’ is ambiguous
overload.cpp:4: note: candidates are: void func(const std::string&)
overload.cpp:5: note:                 void func(const boost::function<void ()()>&)
Run Code Online (Sandbox Code Playgroud)

我知道我可以通过显式调用func(string("bad"))来解决这个问题.或者通过提供一个func(const char*),但我想知道是否有一种方法可以保持调用者方面,如示例中所示,并且不会引入更多重载.

也许是boost :: enable_if的东西?谢谢你的任何提示.

Joh*_*itb 4

你不能轻易解决这个问题。boost::function<>并且std::function<>不仅支持可调用的函子f(),还支持可调用的成员(secondArg.*firstArg)()和数据成员的指针,因此它们的构造函数基本上吸收了所有内容,然后决定如何处理该类型。

编写这样一个防止隐式转换的 SFINAE 测试类并不是一件容易的事(我什至不确定它是否可能,因为标准库不这样做。这一定有某种原因)。请记住,由于许多不同的属性,类型可能是可调用的 - 它可能有一个到函数指针类型等的转换函数。编写一个可以使这项工作正常工作的 SFINAE 类意味着在某些情况下拒绝隐式转换并在以下情况下接受隐式转换:其他情况则基于根本不明显的属性。

如果您想避免这种歧义,我会尝试选择不同的函数名称,或者如果这是一次性问题,请在调用方进行转换。