gpt4 book ai didi

c++ - 由于 std::function 而导致构造函数重载的歧义

转载 作者:行者123 更新时间:2023-11-30 03:44:35 25 4
gpt4 key购买 nike

我想对某个类的构造函数进行两次重载,如下所示:

foo(int, std::function<int(Tpoint, Tpoint)>);
foo(int, std::function<int(Tpoint, Tpoint, std::vector<Tpoint>)>);

调用时出现歧义问题。为什么?

foo<cv::Point> bar(2,[](cv::Point const& l, cv::Point const& r){
return 5;
});

不清楚我是否需​​要这里的第一个构造函数,因为它只有 2 个参数用于 std::function

编辑:

作为Lol4t0评论,它适用于另一个编译器。看来是VS.NET的问题。 Example 1 , Example 2

我使用的是 Microsoft Visual Studio 2013。任何人都可以重现吗?

最佳答案

MSVC 2013 std::function只是一个 C++11 std::function没有来自(如果我没记错的话)缺陷报告的附加功能。

此附加功能是 template<class F> function(F&&)构造函数类似于 SFINAE,仅限于类型 F这样 function实际上可以从该类型构造。 (该标准不强制执行基于 SFINAE 的实现)

实际上,std::function有一个“尝试从任何东西构造”构造函数。当它失败时,它对于重载解析来说失败得太晚了。至少在 MSVC2013 中。所以你的 std::function看起来像是有效的重载。

我相信 2015 的最新版本有一个 std::function具有有限的能力来完成您请求的过载。

在 2013 年,您可以做一个可能有效的变通办法,但这很痛苦。

首先,了解如何重载函数对象集。然后,创建一个函数对象的重载集 F和另一个采用 Tpoint, Tpoint 的函数对象并返回 some_special_tag_type .现在,通过 Tpoint, Tpoint到该重载集,并跟踪返回类型是否为 some_special_tag_type .从 foo(int, F&&) 中标记调度此决定重载到 foo_impl(tag_1, int, std::function<blah_1>)和一个 foo_impl(tag_2, int, std::function<blah_2>) .

只升级到 MSVC2015 或不依赖重载可能更容易。

请注意,如果您重载返回类型而不是参数类型,则此技术实际上是可行的。这很难,因为即使 MSVC2015 也没有“表达式 SFINAE”,这削弱了这种元编程。

关于c++ - 由于 std::function 而导致构造函数重载的歧义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35364478/

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