当前位置: 首页 > 知识库问答 >
问题:

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

邢宏浚
2023-03-14

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

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个答案

巫培
2023-03-14

是否有可能排除回调参数的推导,而只是使用推导的类型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);
} 
 类似资料:
  • 问题内容: 问题摘要: 我想将具有类型参数(例如)的类作为类型参数传递给泛型方法。 假设我有一个方法: 当然,此方法对于任何类型的类都可以正常使用。我可以这样调用该方法,例如: 问题: 我发现我不能这样做: 从句法上讲,这显然是无效的。但是,我不确定如何实现这样的目标。我当然可以通过,但是泛型类型的添加使其在语法上不再有效,并且我想不出解决方法。 唯一的直接解决方案是这样的事情(看起来很愚蠢):

  • 让我们假设下面的方法(从番石榴的Iterables说): 这个系列: 然后编译以下代码并正确导出泛型 (在Guava中,这将返回< code>objs中所有字符串的iterable。) 但是现在让我们假设以下类: 我不知道如何调用并获取

  • 问题内容: 我有一个通用函数,该函数调用Web服务并将JSON响应序列化回一个对象。 我要完成的是等效于此Java代码 我要完成的方法签名正确吗? 更具体地说,将参数类型指定为正确的做法是正确的吗? 调用该方法时,我将其作为returningClass值传递,但是出现编译 错误“无法将表达式的类型’()’转换为’String’类型” CastDAO.invokeService(“test”, wi

  • 我写了以下方法 我如何将不同的枚举类型传递给第二个参数?我知道我不能创建枚举的实例,但初始化枚举意味着我将传递一个值,而不是整个初始化的枚举,如下所示...其他枚举也将传递给相同的方法以实现组合细节

  • 问题内容: 当我定义一个自定义类型时,基础类型的类型似乎对我是否可以按原样将其传递给函数还是需要对其进行转换有所不同。 问题是: 为什么和起作用,但不起作用? https://play.golang.org/p/buKNkrg5y- 在这里,当我运行此函数时,它会抱怨,尽管它是基础类型。但是当我打电话或他们成功运行时。 问题答案: 和 您的新类型是2种不同的不同类型。在预期的地方,您必须传递typ

  • 我正在尝试按房间类别(手术室或技术室)返回过滤后的