提问者:小点点

将导出类型作为参数类型传递给回调


所以我试着做下面这样的事情

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的参数类型是从myfunctionval参数推导出的类型。

所以我的问题是,有没有可能排除callback参数的推导,而只是使用val的推导类型?


共1个答案

匿名用户

是否有可能排除回调参数的推导,而只是使用推导的类型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);
}