gpt4 book ai didi

c++ - 从模板中的子表达式中提取类型

转载 作者:行者123 更新时间:2023-11-28 01:40:37 25 4
gpt4 key购买 nike

给定以下模板函数:

template <typename T>
void f(std::function <void (T)>) {}

我可以提取 T 而不必在调用 f 时明确提及它吗?

f<int>([](int){});工作正常,但我想推导 T 和 f([](int){});只是工作。后者的错误是“没有匹配的调用函数”。

最佳答案

你可以推断T如果传递给函数的对象实际上具有类型 std::function<void(T)> .如果您传入的类型是 lambda,那么您必须从 lambda 的函数调用运算符的类型中推导出它,如下所示:

template <class Callable, class Arg, class T>
void f_helper(Callable callable, Ret (Callable::*)(T)) {
// do something with T
}

template <class Callable>
void f(Callable callable) {
f_helper(callable, &callable::operator());
}

实际上,实际上它比这更烦人,因为您至少需要两次重载 f_helper ,根据lambda是否被声明为可变(决定operator()是否为const),在C++17中你还需要根据lambda是否为noexcept再次将重载次数加倍。 .

标准库通过不尝试从您传递给算法的可调用对象中提取参数类型来回避此类问题,例如 std::sort .它只接受任意可调用类型,然后尝试调用它。

关于c++ - 从模板中的子表达式中提取类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47296434/

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