gpt4 book ai didi

c++11 - C++11 可变参数模板的奇怪替换失败

转载 作者:行者123 更新时间:2023-12-04 08:35:25 25 4
gpt4 key购买 nike

我很难弄清楚是什么导致了这个示例代码中的替换失败:

bool f(int a, int b, float c)
{
printf("%d %d %f", a, b, c);
return true;
}

template <typename ...Params>
void call1(Params... params, std::function<bool(Params...)> func)
{
func(params...);
}

template <typename ...Params>
void call2(std::function<bool(Params...)> func)
{
}

主要的某处:
call1<int, int, float>(3, 4, 5.5, f); // Ok.
call2<int, int, float>(f); // Substitution failure.

编译器说:
template argument deduction/substitution failed: mismatched types 'std::function<bool(Params ...)>' and 'bool (*)(int, int, float)'
call2<int, int, float>(f);
^

令我困惑的是 call1 有效,而 call2 无效。
有小费吗? =)

最佳答案

第一:您可以指定比您使用的参数更少的参数,并让编译器推断出其余的:

template <typename ...Params>
void func1(Params... params);

func1<int, int>(1, 2, 3); // calls func1<int, int, int>

这意味着 Params当你调用它时,它仍然可以添加额外的类型。但是如果你获取函数地址,它就会被定义并关闭:
auto x = func1<int, int>;
x(1, 2, 3); // not possible

当您调用 call1直接作用:
template <typename... Params>
void call1(Params... params, std::function<bool(Params...)> func);

call1<int, int, int>(1, 2, 3, f);
call1<int>(1, 2, 3, f); // same as before
call1(1, 2, 3, f); // same as before

编译器能够推断出您正好有 3 个整数,因为您刚刚向他发送了 3 个整数。这样最后一个参数必须是 std::function<bool(int, int, int)>因为我们完全推导出了 Params...意味着没有更多类型的空间。

现在有问题的案例:
template <typename... Params>
void call2(std::function<bool(Params...)> func);

call2<int, int, int>(f);

在这里,您通知编译器 Params 的前 3 个元素都是整数。 Params = {int, int, int, ...} .请注意,如果扣除表明,它仍然可以添加其他内容。替换我们有: std::function<bool(int, int, int, ...)> func .除非您显式传递 std:function,否则编译器不可能知道这种不完整类型的含义。 (完全符合)。它还不知道它可以有一个构造函数来获取您提供的函数指针,因此存在不匹配。现在编译器没有足够的数据来决定它是否需要更多的类型到 Params 中。或不。失败。

但请注意这个有趣的案例:
auto x = call2<int, int, int>;
x(f); // x is exactly void(*)(std::function<bool(int, int, int)>). No doubts.

这里你逼 Params要完整。没有任何扣分可以评估。虽然丑陋,但这也有效:
(&call2<int, int, int>)(f);

关于c++11 - C++11 可变参数模板的奇怪替换失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20172156/

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