gpt4 book ai didi

C++ 重载:字符串文字与 boost::function 歧义

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:36:49 25 4
gpt4 key购买 nike

我的问题代码:

#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;
}

=>

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 的东西?感谢您的任何提示。

最佳答案

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

编写这样一个防止隐式转换的 SFINAE 测试类一点也不简单(而且我什至不确定它是否完全可能,因为标准库不这样做。那必须有一些原因)。请记住,由于许多不同的属性,一个类型可能是可调用的 - 它可能具有到函数指针类型等的转换函数。编写一个 SFINAE 类可以使这项工作意味着在某些情况下拒绝隐式转换并在其他情况基于根本不明显的属性。

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

关于C++ 重载:字符串文字与 boost::function 歧义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4757387/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com