gpt4 book ai didi

c++ - 如何使用 std::shared_ptr 和另一种类型的 std::shared_ptr 进行函数重载?

转载 作者:IT老高 更新时间:2023-10-28 23:00:51 25 4
gpt4 key购买 nike

试试下面的代码:

#include <functional>
#include <memory>

class C {
public:
void F(std::function<void(std::shared_ptr<void>)>){}
void F(std::function<void(std::shared_ptr<int>)>){}
};

int main(){
C c;
c.F([](std::shared_ptr<void>) {});
}

你会看到一个编译错误:

prog.cc:12:7: error: call to member function 'F' is ambiguous
c.F([](std::shared_ptr<void>) {});
~~^
prog.cc:6:10: note: candidate function
void F(std::function<void(std::shared_ptr<void>)>){}
^
prog.cc:7:10: note: candidate function
void F(std::function<void(std::shared_ptr<int>)>){}
^

有什么办法可以解决这种歧义?也许与 SFINAE 合作?

最佳答案

我很困惑,但我试着解释一下。

我发现 std::function<void(std::shared_ptr<void>)> 都可以接受您的 lambda和 std::function<void(std::shared_ptr<int>)> ;您可以验证以下两行是否编译

std::function<void(std::shared_ptr<void>)>  f0 = [](std::shared_ptr<void>){};
std::function<void(std::shared_ptr<int>)> f1 = [](std::shared_ptr<void>){};

这是因为(我想)一个指向 int 的共享指针可以转换为指向void的共享指针;您可以验证以下行是否编译

std::shared_ptr<void> sv = std::shared_ptr<int>{};

此时我们可以看到调用

c.F([](std::shared_ptr<void>) {});

你没有通过 std::function<void(std::shared_ptr<void>)>F() ;您正在传递一个可以转换为 std::function<void(std::shared_ptr<void>)> 的对象和 std::function<void(std::shared_ptr<int>)> ;所以一个可以用来调用F()的两个版本的对象.

所以模棱两可。

Is there any way to workaround this ambiguity? Perhaps with SFINAE?

也许有标签调度。

您可以添加一个未使用的参数和一个模板 F()

void F (std::function<void(std::shared_ptr<void>)>, int)
{ std::cout << "void version" << std::endl; }

void F (std::function<void(std::shared_ptr<int>)>, long)
{ std::cout << "int version" << std::endl; }

template <typename T>
void F (T && t)
{ F(std::forward<T>(t), 0); }

这样叫

c.F([](std::shared_ptr<void>) {});
c.F([](std::shared_ptr<int>){});

您从第一次调用获得“无效版本”(非模板 F() 匹配,但首选“无效版本”,因为 0int)和从第二次调用获得“int 版本”(只有 F() “int 版本”匹配)。

关于c++ - 如何使用 std::shared_ptr<void> 和另一种类型的 std::shared_ptr 进行函数重载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54543057/

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