我正在尝试bar
在另一个函数的参数 ( foo1
/ foo2
) 的上下文中解析重载函数 ( ) 的地址。
struct Baz {};
int bar() { return 0; }
float bar(int) { return 0.0f; }
void bar(Baz *) {}
void foo1(void (&)(Baz *)) {}
template <class T, class D>
auto foo2(D *d) -> void_t<decltype(d(std::declval<T*>()))> {}
int main() {
foo1(bar); // Works
foo2<Baz>(bar); // Fails
}
没有问题foo1
,它明确指定bar
' 类型。
但是,foo2
通过 SFINAE 禁用除一个版本之外的所有版本的bar
,无法编译并显示以下消息:
main.cpp:19:5: fatal error: no matching function for call to 'foo2'
foo2<Baz>(bar); // Fails
^~~~~~~~~
main.cpp:15:6: note: candidate template ignored: couldn't infer template argument 'D'
auto foo2(D *d) -> void_t<decltype(d(std::declval<T*>()))> {}
^
1 error generated.
据我了解,C++ 不能同时解析重载函数的地址并执行模板参数推导。
是这个原因吗?有没有办法foo2<Baz>(bar);
编译(或类似的东西)?