仅通过参数查找重载地址

Maë*_*son 5 c++ templates overload-resolution

假设一个函数(可以是全局函数或成员函数)仅在其参数上重载(因此它的重载将始终是所有const或所有非const).有没有办法编写一个模板,根据指定的参数选择一个重载地址?例如:

struct Foo {
    double bar(double n, double m);
    int bar(int n, int m);
};

auto addressDouble = find_overload<&Foo::bar, double, double>::address;
auto addressInt = find_overload<&Foo::bar, int, int>::address;
Run Code Online (Sandbox Code Playgroud)

我发现一个有趣的答案就在这里,但遗憾的是它只处理转发正确重载的调用,而不是实际获取重载地址以便以后使用.

最后一点:完美的解决方案应该适用于已发布的Clang版本.除此要求外,还可以使用任何可用的C++ 1z功能.

MRB*_*MRB 1

在访问重载函数的地址之前,您必须指定需要哪个版本。

template<typename ...TA>
struct find_overload
{
    template<typename TObj, typename TR>
    using member_func_t = TR(TObj::*)(TA...);

    template< typename TObj, typename TR >
    static constexpr auto get_address(member_func_t<TObj, TR> func) -> member_func_t<TObj, TR>
    {
        return func;
    }
};

int main()
{
    constexpr auto address = find_overload<double, double>::get_address(&Foo::bar);
}
Run Code Online (Sandbox Code Playgroud)