gpt4 book ai didi

c++ - 在模板化函数上使用 std::function

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

这个问题在这里已经有了答案:





Passing template function as argument for normal function

(2 个回答)


2个月前关闭。




我正在尝试使用 std::function为了实现这一点(代码不编译,ofc):

template <typename Duration>
void operation1(int i)
{
// do some chrono stuff
}

template <typename Duration>
void operation2(int i)
{
// do other chrono stuff
}

void callFunc(const std::function<void(int)>& func, int i)
{
func<std::chrono::hours>(i);
func<std::chrono::minutes>(i);
func<std::chrono::seconds>(i);
func<std::chrono::milliseconds>(i);
}

int main()
{
callFunc(operation1, 10);
callFunc(operation2, 5);
}
问题似乎在于函数 operations1operations2是模板化的,我不知道如何称呼它们。如果我删除模板,一切正常。
我愿意接受其他使用 make 功能的建议 callFunc一个模板,如果它有效。
https://godbolt.org/z/cq5b1ozjP
谢谢
附言我知道打电话 callFunc(operation1<std::chrono::hours>, 10);有效,但这对我没有帮助,我试图摆脱重复的代码,否则我可以删除 callFunc并直接使用 operation1operation2 ,就像我现在所做的...

最佳答案

它类似于 here 的问题,但这个问题略有不同,因为不能从参数类型推导出模板。
如果模板函数未在链接处实例化为答案,则无法传递或评估该模板函数。
所以你应该把你的函数改成仿函数,

struct operation1 {
template<typename Duration>
void operator()(int i) {
// do something
}
};
并将仿函数传递给调用者。

template<typename Functor>
void callFunc(Functor func, int i)
{
func.template operator()<std::chrono::hours>(i);
func.template operator()<std::chrono::minutes>(i);
func.template operator()<std::chrono::seconds>(i);
func.template operator()<std::chrono::milliseconds>(i);
}

int main() {
callFunc(operation1{}, 10);
}

关于c++ - 在模板化函数上使用 std::function,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68098839/

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