gpt4 book ai didi

c++ - 传递带有模板化参数的函数作为参数,带有函数指针与 std::function

转载 作者:行者123 更新时间:2023-11-30 01:41:54 25 4
gpt4 key购买 nike

所以我有一些泛型类,它有两个以函数为参数的函数。一个接受函数指针,一个接受 std::function。两者都有一个模板参数。

#include <functional>
#include <memory>

namespace {
void example(const std::shared_ptr<const int>&) {}
}

class Generic {
public:
Generic() {}
virtual ~Generic() {}
template <typename Targ>
void doWork(std::function<void(const std::shared_ptr<const Targ>&)> arg) {}

template <typename Targ>
void doWork2(void(*function)(const std::shared_ptr<const Targ>&)) {}
};

class Special : public Generic {
public:
Special() {
//doWork(&example); // Fail!
doWork<int>(&example); // OK!
std::function<void(const std::shared_ptr<const int>&)> func = &example;
doWork(func); // OK!
doWork2(&example); // OK!
}
};

int main(int argc, char** argv) {
Special special;
return 0;
}

它使用函数指针编译,但使用 std::function 则不编译。为什么这里模板推导会失败?

Clang 报告:

example.cpp:27:9: error: no matching member function for call to 'doWork'
doWork(&example);
^~~~~~
example.cpp:14:10: note: candidate template ignored: could not match 'function<void (const shared_ptr<const type-parameter-0-0> &)>' against 'void (*)(const std::shared_ptr<const int> &)'
void doWork(std::function<void(const std::shared_ptr<const Targ>&)> arg) {
^
1 error generated.

最佳答案

模板参数推导不是那样工作的。

模板参数推导是一种模式匹配。是example std::function<void(const std::shared_ptr<const Targ>&)> 类型的对象对于某些类型 Targ

不能转换为,但实际上已经是那种类型的对象了?

不,不是。

然而,它已经是一个函数指针(使用隐式衰减规则)。

有一个 C++17 特性涉及从构造函数类型推导出模板参数; std::function在这种情况下,当 C++17 或 C++20 出现时,可能会也可能不会被用来从函数指针学习自己的类型。可以肯定的是,我缺乏 C++17 方面的专业知识。

关于c++ - 传递带有模板化参数的函数作为参数,带有函数指针与 std::function,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40596404/

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