gpt4 book ai didi

c++ - 非成员函数中的隐式参数转换歧义用 std::function 重载?

转载 作者:搜寻专家 更新时间:2023-10-31 01:08:54 25 4
gpt4 key购买 nike

已编辑 - 请跳到编辑部分,它有真正的问题

我经常在我的独立函数的字符串帮助程序库中遇到这样的情况,我在其中提供一个函数的重载,其版本采用 char。和采用 std::string 的版本.

问题是,当传递字符串文字 (const char*) 时,重载会变得不明确。

例子:

void myFunc(const std::string &subStr);
void myFunc(char character);

这两个函数的实现方式不同,一个针对字符串进行了优化,一个针对单个字符进行了优化。然而,试图调用myFunc("literal")导致歧义,尽管我一直希望它调用 std::string版本。

这迫使我提供 void myFunc(const char *str)我的重载版本,它们只是 stub ,例如:

void myFunc(const char *str)
{
myFunc(std::string(str));
}

有什么方法可以使这些 stub 函数变得不必要吗?我只想能够制作void myFunc(char c) '显式',但您不能使非构造函数非成员函数显式。这将立即解决问题。 =(...

(顺便说一句,为什么不能显式地显示独立函数?)

编辑:你知道他们怎么说程序员编码到深夜! (如果你还记得这个笑话,请告诉我,因为我最初听到它时太困了,后来我忘记了)

真正的问题

我使用的是 MinGW v4.7.2,问题与我最初假设的问题有很大不同。

问题是,我有几个重载。是的,这个例子工作正常:

void myFunc(const std::string &subStr);
void myFunc(char character);

但是如果你添加一个 std::function 重载,它就会崩溃:

void myFunc(const std::string &subStr);
//Not actually part of the problem; I was confused by part of the error message highlighting this function.
//void myFunc(char character);
void myFunc(std::function<bool(char)); //<-- The real problem

我的字符串库有 std::string、char 和 std::function 重载(偶尔还有一些重载用于简化带有大量可选参数的函数)。

当我将 std::function 作为重载时,我收到此错误消息:

error: call of overloaded ‘myFunc(const char [15])’ is ambiguous
candidates are:
void myFunc(char) <near match>
no known conversion for argument 1 from ‘const char [15]’ to ‘char’
void myFunc(std::function<bool(char)>)
void myFunc(const string&)

myFunc(char) 是我昨晚最初感到困惑的原因。从代码中删除该重载,我收到错误消息:

error: call of overloaded ‘myFunc(const char [15])’ is ambiguous
candidates are:
void myFunc(std::function<bool(char)>)
void myFunc(const string&)

Here's a self-contained compilable example.

如何让字符串文字在 std::function 上选择 std::string?这可能是模棱两可的,因为 std::function 的构造函数是模板化的并且被设计为采用函数指针等。

因为我的字符串库,特别是,只使用 std::function<bool(char)>std::function<bool(const std::string&)> ,已经进行了类型定义,我可以将它们继承到具有显式构造函数的类中。

还有其他建议或选项吗?

最佳答案

你能更新你的编译器吗?您的示例在 g++4.8 and above 中按预期编译.

这实际上是 C++ 标准中的当前缺陷报告。参见 2132. std::function ambiguity .它目前处于审查状态,但很可能会被接受。这将确保像您的示例这样的不可调用类型永远不会参与重载决议:

These constructors shall not participate in overload resolution unless f is Callable

目前g++4.8及以上实现了这个。

关于c++ - 非成员函数中的隐式参数转换歧义用 std::function 重载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17584749/

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