gpt4 book ai didi

c++ - std::function 中的可变模板参数匹配

转载 作者:可可西里 更新时间:2023-11-01 17:38:05 24 4
gpt4 key购买 nike

我有以下代码:

#include <iostream>
#include <functional>

template<typename Return, typename... Params>
void func(std::function<Return(Params... )> x) {}

void f(double) {}

int main() {
//func<void, double>(f); // compile error here in the variadic case
func(std::function<void(double)>(f));
}

我有两个问题:

1.我不明白为什么 func<void, double>(f); 行给我一个编译错误

/Users/vlad/minimal.cpp:10:5: error: no matching function for call to 'func'
func<void, double>(f); // compile error here in the variadic case
^~~~~~~~~~~~~~~~~~
/Users/vlad/minimal.cpp:5:6: note: candidate template ignored: could not match 'function<void (double, type-parameter-0-1...)>' against 'void (*)(double)'
void func(std::function<Return(Params... )> x) {}
^
1 error generated.

而如果我转换参数 fstd::function (如在非注释行中)它有效。

2。最令人费解的问题是,如果我使用 func 的非可变版本(即只需将 typename... 替换为 typename 所以实际上 funcstd::function<Return(Params)> 作为参数),然后是 main 中的注释行按需工作。有什么想法吗?

最佳答案

I do not understand why does the line func<void, double>(f); give me a compiling error

编译器不知道你想要Params 完全 double ,它认为您可能希望它推断出包含更多元素的包,例如 double, int, void*, chardouble, double, double或其他一些类型包,它不知道如何从参数 f 中推断出它.

理论上 std::function 可能还有其他特化可以从 f 构建这将允许编译器为 Params 推断出不止一种类型的包。 (如果不实例化 std::function所有可能的特化并测试它们,它就无法知道这不是真的,这是不可行的。

whereas if I cast the parameter f to a std::function (as in the non-commented line) it works.

因为现在编译器能够推导出Params正确。

And the most puzzling issue is that, if I use a non-variadic version of func [...] then the commented line in main works as desired. Any ideas why?

因为现在编译器知道 Params是单一类型,而不是零个或多个类型的包,所以当你说 func<void, double>它知道Paramsdouble ,而不是 double, int, void*, char或其他一些参数包。

编辑以回答您的评论,考虑一下:

template<typename T, typename U, typename V>
int func(T t, U u, V v)
{ return 0; }

int i = func<int, char>(1, '2', "three");

我只为其中两个参数给出了显式模板实参,因此仍必须推导第三个。

当您有一个可变参数模板时,可能还有任意数量的其他参数需要推导。

关于c++ - std::function 中的可变模板参数匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23900059/

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