2

我想要这样的功能:

template<typename C, typename T>
void foo(C &&aclass, T (C::*const memberFunc)(unsigned)) {

}

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

  • 对类的通用引用,例如MyClass.
  • 指向其成员函数的 const 指针MyClass采用 unsigned int 并返回T

这种工作,但是如果我用左值引用作为第一个参数调用它,我会收到如下错误:

候选模板被忽略:推断参数“C”的冲突类型(“MyClass &”与“MyClass”)

据我了解,它是C从第一个参数和第二个参数推导出来的,但是得出了不同的推导并感到困惑。

根据这个答案,你可以让它只对第一个参数进行推导,并以某种方式typename在第二个参数上使用关键字。T但是当我确实希望它推断出参数 ( ) 中的一种类型而不是另一种 ( )时,我无法计算出执行此操作的语法C

这个答案也很有帮助,但他们通过根本不使用引用来解决它C在这种情况下,这同样有效,但不是我的。

这可能吗?

4

2 回答 2

7

对于第一个参数,C左值将被推断为左值引用类型(即MyClass &对于您的情况),这是转发引用的预期行为;在第二个参数中使用时,您可以通过std::remove_reference删除引用,例如C

template<typename C, typename T>
void foo(C &&aclass, T (std::remove_reference_t<C>::*const memberFunc)(unsigned)) {

}

正如@Quentin 指出的那样,使用 ofstd::remove_reference还引入了非推断上下文,这将防止C从第二个参数中推断出来。

于 2018-02-21T14:11:23.627 回答
0

实际上,我只是发现将通用参考重载转发到左值参考版本是可行的。虽然不是特别优雅;我觉得应该有更好的方法。

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);
}
于 2018-02-21T14:10:58.543 回答