gpt4 book ai didi

c++ - 可变参数模板、类型推导和 std::function

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:33:55 26 4
gpt4 key购买 nike

我正在尝试制作一个模板函数,可以将具有任何类型和数量的参数的其他函数传递给它,并将其绑定(bind)到 std::function .我设法做到了这一点:

#include <iostream>
#include <functional>

int foo(int bar)
{
std::cout << bar << std::endl;
return bar;
}

template <typename Ret, typename... Args>
std::function<Ret (Args...)> func(std::function<Ret (Args...)> f)
{
return f;
}

int main()
{
//auto barp = func(foo); // compilation error
auto bar = func(std::function<void (int)>(foo));

bar (0); // prints 0
}

我只想调用auto barp = func(foo);并推导出类型,但是这一行给出了以下编译错误:

error: no matching function for call to ‘func(void (&)(int))’
auto barp = func(foo);
^
note: candidate is:
note: template<class Ret, class ... Args> std::function<_Res(_ArgTypes ...)> func(std::function<_Res(_ArgTypes ...)>)
std::function<Ret (Args...)> func(std::function<Ret (Args...)> f)
^
note: template argument deduction/substitution failed:
note: mismatched types ‘std::function<_Res(_ArgTypes ...)>’ and ‘int (*)(int)’
auto barp = func(foo);
^

为什么要匹配 std::function<_Res(_ArgTypes ...)>int (*)(int) ?我觉得我应该让编译器以某种方式扩展 _Res(_ArgTypes ...)int(int) ,但是如何呢?

最佳答案

函数不是 std::function,它可以转换为一个。但是,您可以推导出函数的参数,除非对重载有歧义。

#include <iostream>
#include <functional>

int foo(int bar)
{
std::cout << bar << std::endl;
return 0;
}

// Will cause error.
//int foo(double);

template <typename Ret, typename... Args>
std::function<Ret (Args...)> func(Ret f(Args...))
{
return f;
}

int main()
{
auto bar = func(foo);
bar (0); // prints 0
}

你想用原始的 std::function 做的事情与此类似,更明显的是行不通:

template<typename T>
struct A
{
A(T);
};

template<typename T>
void func(A<T> a);

int main()
{
func(42);
}

42 不是 A,但它可以转换为 1。但是,将其转换为一个需要已知 T

关于c++ - 可变参数模板、类型推导和 std::function,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32555687/

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