获取指向将被调用的重载函数的指针
Get pointer to overloaded function that would be called
请参考以下内容:
struct functorOverloaded
{
void operator()(const int& in_, ...) const {}
void operator()(short in_) {}
};
// helper to resolve pointer to overloaded function
template <typename C, typename... OverloadArgs>
auto resolve_overload(
std::invoke_result_t<C, OverloadArgs...> (C::* func)(OverloadArgs..., ...) const
)
{ return func; };
int main(int argc, char **argv)
{
using C = const functorOverloaded;
// works with exact function type
using myT = decltype(resolve_overload<C, const int&>(&C::operator()));
// can call with something convertible to const int&
static_assert(std::is_invocable_v<C,int>, "!!!");
// how to get the pointer to the overload that would be called when passed int (or double)?
// the next line doesn't compile (error C2672: 'resolve_overload': no matching overloaded function found)
using myT2 = decltype(resolve_overload<C, int>(&C::operator()));
return 0;
}
以上代码允许检索指向函数特定重载的指针(在本例中为operator()
),see here。在这种情况下,必须知道确切的参数类型 (const int&
) 才能获得指针,即使我可以只用普通的 int
或什至 double
调用特定的重载。是否有可能获得指向将使用特定参数调用的重载的指针(假设调用是可解析的/不模糊的)?
编辑:添加上下文:
我正在写一个 invocable_traits
library 用于内省可调用对象。例如,给定一个 Callable,它会告诉您 return 类型、元数和参数类型,以及其他一些属性。为了支持具有重载(或模板化)的仿函数(包括 lambda)operator()
,invocable_traits
的 API 允许指定调用参数以消除要使用的重载(或实例化模板)的歧义.但是,必须知道确切的参数类型(上例中的 const int&
),在这种情况下简单地指定 int
是行不通的,因为没有带有签名 R operator()(int)
的函数。理想情况下,我希望允许发现根据提供的输入参数类型调用的确切 overload/instantiation 的签名,理想情况下甚至考虑应用的任何隐式转换。这可能吗?
除非您已经知道它的签名,否则无法获得将使用给定参数调用的重载集的函数。
如果你知道,那又有什么意义呢?
问题在于,对于任何给定的参数,考虑到隐式转换、引用、cv 限定符、noexcept
、旧式可变参数、默认参数,以及可能还有作为空指针常量的文字 0 ,有无数个函数签名可以匹配。目前还没有“只”列出所有候选人的工具。
请参考以下内容:
struct functorOverloaded
{
void operator()(const int& in_, ...) const {}
void operator()(short in_) {}
};
// helper to resolve pointer to overloaded function
template <typename C, typename... OverloadArgs>
auto resolve_overload(
std::invoke_result_t<C, OverloadArgs...> (C::* func)(OverloadArgs..., ...) const
)
{ return func; };
int main(int argc, char **argv)
{
using C = const functorOverloaded;
// works with exact function type
using myT = decltype(resolve_overload<C, const int&>(&C::operator()));
// can call with something convertible to const int&
static_assert(std::is_invocable_v<C,int>, "!!!");
// how to get the pointer to the overload that would be called when passed int (or double)?
// the next line doesn't compile (error C2672: 'resolve_overload': no matching overloaded function found)
using myT2 = decltype(resolve_overload<C, int>(&C::operator()));
return 0;
}
以上代码允许检索指向函数特定重载的指针(在本例中为operator()
),see here。在这种情况下,必须知道确切的参数类型 (const int&
) 才能获得指针,即使我可以只用普通的 int
或什至 double
调用特定的重载。是否有可能获得指向将使用特定参数调用的重载的指针(假设调用是可解析的/不模糊的)?
编辑:添加上下文:
我正在写一个 invocable_traits
library 用于内省可调用对象。例如,给定一个 Callable,它会告诉您 return 类型、元数和参数类型,以及其他一些属性。为了支持具有重载(或模板化)的仿函数(包括 lambda)operator()
,invocable_traits
的 API 允许指定调用参数以消除要使用的重载(或实例化模板)的歧义.但是,必须知道确切的参数类型(上例中的 const int&
),在这种情况下简单地指定 int
是行不通的,因为没有带有签名 R operator()(int)
的函数。理想情况下,我希望允许发现根据提供的输入参数类型调用的确切 overload/instantiation 的签名,理想情况下甚至考虑应用的任何隐式转换。这可能吗?
除非您已经知道它的签名,否则无法获得将使用给定参数调用的重载集的函数。
如果你知道,那又有什么意义呢?
问题在于,对于任何给定的参数,考虑到隐式转换、引用、cv 限定符、noexcept
、旧式可变参数、默认参数,以及可能还有作为空指针常量的文字 0 ,有无数个函数签名可以匹配。目前还没有“只”列出所有候选人的工具。