C++ 是否可以获取ADL函数的地址?
是否可以获取通过ADL找到的函数的地址 例如:C++ 是否可以获取ADL函数的地址?,c++,function-pointers,argument-dependent-lookup,C++,Function Pointers,Argument Dependent Lookup,是否可以获取通过ADL找到的函数的地址 例如: template<class T> void (*get_swap())(T &, T &) { return & _________; // how do I take the address of T's swap() function? } int main() { typedef some_type T; get_swap<T>(); } 模板 void(
template<class T>
void (*get_swap())(T &, T &)
{
return & _________; // how do I take the address of T's swap() function?
}
int main()
{
typedef some_type T;
get_swap<T>();
}
模板
void(*get_swap())(T&,T&)
{
return&&____;;//如何获取T的swap()函数的地址?
}
int main()
{
typedef一些_类型T;
获得交换();
}
老实说,我不知道,但我倾向于说这是不可能的
根据您想要实现的目标,我可以建议一种解决方法。更准确地说,如果您只需要一个函数的地址,该函数的语义与通过ADL调用的swap
相同,那么您可以使用:
template <typename T>
void (*get_swap())(T&, T&) {
return [](T& x, T& y) { return swap(x, y); };
}
相关的装配代码(objdump-dSC a.out
)为
0000000000 4008a0 post.)
namespace a {
struct b {
int i;
};
void swap(b& x, b& y) {
std::swap(x.i, y.i);
}
}
int main() {
auto f0 = (void (*)(a::b&, a::b&)) a::swap;
auto f1 = get_swap<a::b>();
std::cout << std::hex;
std::cout << (unsigned long long) f0 << '\n';
std::cout << (unsigned long long) f1 << '\n';
}
4008a0
4008b0
00000000004008a0 <a::swap(a::b&, a::b&)>:
4008a0: 8b 07 mov (%rdi),%eax
4008a2: 8b 16 mov (%rsi),%edx
4008a4: 89 17 mov %edx,(%rdi)
4008a6: 89 06 mov %eax,(%rsi)
4008a8: c3 retq
4008a9: 0f 1f 80 00 00 00 00 nopl 0x0(%rax)
00000000004008b0 <void (*get_swap<a::b>())(a::b&, a::b&)::{lambda(a::b&, a::b&)#1}::_FUN(a::b&, a::b&)>:
4008b0: 8b 07 mov (%rdi),%eax
4008b2: 8b 16 mov (%rsi),%edx
4008b4: 89 17 mov %edx,(%rdi)
4008b6: 89 06 mov %eax,(%rsi)
4008b8: c3 retq
4008b9: 0f 1f 80 00 00 00 00 nopl 0x0(%rax)