我正在编写一个委托库,并针对这个问题进行了顽固处理:假设我像这样重载了名为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()
{...}