获取所有函数重载的参数类型
Get parameter types of all function overloads
假设我有一个 class bar
方法的多个实现 foo
:
struct bar {
void foo(int, int);
void foo(float, bool);
void foo(const vector<void*>&);
}
我是否有可能获得参数类型列表的列表?也就是说,我定义
template<typename... types> class list {};
想获得list<list<int, int>, list<float, bool>, list<const vector<void*>&>>
.
没有
您可以提出问题"can I call bar.foo
with args int, long
?"。您可以提出问题 "is there a &Bar::foo
method of type void (Bar::*)(int, int)
?",但都不符合您的要求。
你可以做的另一件事是完美转发到bar.foo
,甚至做SFINAE测试所以转发失败导致转发接口失败,而不是内部它的实现。
如果您有一个有限的类型列表和最大 arg 计数,您可以以 O(T^N) 的成本详尽地搜索重载集以找到有效的重载或精确的签名匹配。
作为社论,您的问题具有此类问题的常见缺陷,您在其中描述了特定的技术挑战,甚至没有随便描述该挑战旨在解决的问题。 "I want to reflect on function signature overload" 问题的可靠性实际上令人震惊,从来没有自愿提出他们的思考旨在解决的特定问题。很多很多这样的问题都有不需要全反射就能解决的解决方案。
假设我有一个 class bar
方法的多个实现 foo
:
struct bar {
void foo(int, int);
void foo(float, bool);
void foo(const vector<void*>&);
}
我是否有可能获得参数类型列表的列表?也就是说,我定义
template<typename... types> class list {};
想获得list<list<int, int>, list<float, bool>, list<const vector<void*>&>>
.
没有
您可以提出问题"can I call bar.foo
with args int, long
?"。您可以提出问题 "is there a &Bar::foo
method of type void (Bar::*)(int, int)
?",但都不符合您的要求。
你可以做的另一件事是完美转发到bar.foo
,甚至做SFINAE测试所以转发失败导致转发接口失败,而不是内部它的实现。
如果您有一个有限的类型列表和最大 arg 计数,您可以以 O(T^N) 的成本详尽地搜索重载集以找到有效的重载或精确的签名匹配。
作为社论,您的问题具有此类问题的常见缺陷,您在其中描述了特定的技术挑战,甚至没有随便描述该挑战旨在解决的问题。 "I want to reflect on function signature overload" 问题的可靠性实际上令人震惊,从来没有自愿提出他们的思考旨在解决的特定问题。很多很多这样的问题都有不需要全反射就能解决的解决方案。