首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >推导出用于通用引用和成员指针的冲突类型

推导出用于通用引用和成员指针的冲突类型
EN

Stack Overflow用户
提问于 2018-02-21 06:07:29
回答 2查看 314关注 0票数 2

我想要这样的功能:

代码语言:javascript
运行
AI代码解释
复制
template<typename C, typename T>
void foo(C &&aclass, T (C::*const memberFunc)(unsigned)) {

}

参数是(因为C/C++类型语法是心智的):

  • 对类的通用引用,如MyClass
  • 指向MyClass的成员函数的const指针,该函数接受无符号int并返回T

但是,如果我使用l-值引用作为第一个参数调用它,则会得到如下错误:

候选模板被忽略:推导出参数'C‘('MyClass &’)的冲突类型。“MyClass”)

据我所知,它是从第一个和第二个参数中推导出C的,但是得到了不同的推论,并且变得混乱。

根据这个答案,您可以使它只对第一个参数进行推断,并在第二个参数上以某种方式使用typename关键字。但是,当我想让它推断参数(T)中的一种类型,而不是另一种类型(C)时,我无法找到这样的语法。

这个答案也很有帮助,但是他们解决这个问题的方法是完全不对C使用引用,在这种情况下,引用是同样有效的,但在我的情况下却不是。

这个是可能的吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-02-21 06:11:23

使用lvalue,C将被推导为第一个参数的lvalue引用类型(即MyClass & ),这是转发参考的预期行为;在第二个参数中使用C时,您可以通过参考文献删除引用。

代码语言:javascript
运行
AI代码解释
复制
template<typename C, typename T>
void foo(C &&aclass, T (std::remove_reference_t<C>::*const memberFunc)(unsigned)) {

}

正如@Quentin所指出的,使用std::remove_reference还引入了非推断语境,这将防止从第二个参数推导C

票数 7
EN

Stack Overflow用户

发布于 2018-02-21 06:10:58

实际上,我刚刚发现,让一个通用的引用重载将它转发到一个l值引用版本是有效的。虽然不是特别优雅,但我觉得应该有更好的方法。

代码语言:javascript
运行
AI代码解释
复制
template<typename C, typename T>
void foo(C &aclass, T (C::*const memberFunc)(unsigned)) {
  // Code goes here.
}

template<typename C, typename T>
void foo(C &&aclass, T (C::*const memberFunc)(unsigned)) {
  foo(aclass, memberFunc);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48907948

复制
相关文章

相似问题

领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档