我的问题代码:
#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;
}
=&GT;
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 ()()>&)
我知道我可以通过显式调用func(string(“bad”))来解决这个问题。或者通过提供一个func(const char *),但我想知道是否有一种方法可以保持调用者方面,而不会引入更多的重载。
也许是boost :: enable_if的东西? 感谢任何提示。
答案 0 :(得分:4)
你不能轻易解决这个问题。 boost::function<>
和std::function<>
不仅支持f()
可调用的函子,而且还支持(secondArg.*firstArg)()
和数据成员可调用的成员的指针,因此它们的构造函数基本上都会包含所有内容,并且后来决定如何处理这种类型。
编写这样一个防止隐式转换的SFINAE测试类并不是微不足道的(我甚至不确定它是否完全可能,因为标准库没有这样做。这必须有一些原因)。请记住,由于许多不同的属性,类型可以是可调用的 - 它可能具有转换函数以指示函数指针类型等。编写可以使此工作的SFINAE类意味着在某些情况下拒绝隐式转换并接受隐式转换其他案例基于真正不明显的属性。
如果你想避免这种歧义,我会尝试选择一个不同的函数名称,或者如果它是一次性问题,请在调用方面进行转换。
答案 1 :(得分:0)
添加:
void func (const char *s) { func(string(s)); }
更新
template<class A0, ...>
void func (const A0 &a0, ...) {
func(argize(a0), ...); // convert chars to strig, otherwise jut pass
}