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

问题描述 投票:0回答:1

我正在编写一个委托库,并针对这个问题进行了顽固处理:假设我像这样重载了名为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.
c++ delegates variadic-templates signature overload-resolution
1个回答
1
投票

您可以在签名上添加*以获取正确的功能指针类型。

template<typename Signature, Signature* fptr>
auto make_delegate()
{...}
© www.soinside.com 2019 - 2024. All rights reserved.