所以我试着做下面这样的事情
int x = 123;
myFunction(x, [](auto y) {
std::cout << y;
});
并且myfunction
定义为
template <typename T>
void myFunction(T val, void(*callback)(T)) {
callback(val);
}
当尝试编译代码时,clang给出错误不能匹配'void(*)(T)'反对'(lambda at...)'
。我发现这是因为你不能从lambda推断出类型。
所以这实际上是正确的,因为我实际上希望callback
的参数类型是从myfunction
的val
参数推导出的类型。
所以我的问题是,有没有可能排除callback
参数的推导,而只是使用val
的推导类型?
是否有可能排除回调参数的推导,而只是使用推导的类型val?
当然可以。
如果您定义了这样东西
template <typename T>
struct self
{ using type = T; };
您可以如下定义MyFunction()
template <typename T>
void myFunction(T val, void(*callback)(typename self<T>::type)) {
callback(val);
}
现在t
是从val
推导出来的,用于回调
。
从C++20开始,您可以避免self
定义,而使用新引入的std::type_identity_t
template <typename T>
void myFunction(T val, void(*callback)(std::type_identity_t<T>)) {
callback(val);
}