如何通过将签名作为模板参数来解析重载函数?

How do I resolve an overloaded function by it's signature as a template parameter?

我正在编写一个委托库并偶然发现了这个问题:假设我有一个名为 foo 的重载函数,如下所示:

int foo(double d);
double foo(int d);

如果我想通过将签名指定为模板参数来确定哪个函数意味着什么,我将如何编写模板参数列表。我基本上想要这个语法(但它应该适用于任何签名):

Delegate d = make_delegate<&foo,int(double)>(); // "Delegate" is automatically deduced as Delegate<int(double)>

我设法通过使用以下帮助程序模板解决了它,但它只有在我手动编写函数签名的参数类型时才有效。我努力将可变参数包 Args...(在 Args_pack 专业化中编码)转发到函数签名。

template<typename... Args>
struct Args_pack {}

template<typename Signature>
struct Identify_signature_type;

template<typename Return, typename... Args>
struct Identify_signature_type<Return(Args...)> {

    using T_return = Return;
    using Args_pack = Args_pack<Args...>;
};

template<auto Signature> using Identify_signature = Identify_signature_type<decltype(Signature)>;


template<typename Signature, typename Identify_signature_type<Signature>::T_return Function(double /* important magic needed here */)>
auto make_delegate()
{...}

Delegate d = make_delegate<int(double), &foo>(); // Works. However, it would be nice if the template parameters could exchange places.

您可以在签名中添加一个*以获得正确的函数指针类型。

template<typename Signature, Signature* fptr>
auto make_delegate()
{...}