我正在尝试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);编译(或类似的东西)?