部分专用模板的单独实现

Separate implementation of a partially specialized template

我正在为 class 创建一个模板,它应该将函数签名作为模板参数(实际上是该签名的工厂 class)。

为此,我使用了这些 SO 问题中也提到的技术: Function signature-like expressions as C++ template arguments and Function signature as template parameter.

只要我在专业化定义中有声明,它就可以正常工作:

template<typename Signature>
class Factory;

template<typename Ret, typename... Args>
class Factory<Ret(Args...)>
{
public:
Factory(){}
};

现在我想在定义之后分隔声明以使 header 对用户更具可读性,但我找不到合适的签名。

我尝试了以下签名

template<typename Ret, typename... Args>
Factory<Ret, Args...>::Factory(){}

template<typename Ret, typename... Args>
Factory<Ret(Args...)>::Factory(){}

但在这两种情况下,编译器都试图为通用模板而不是专门化定义函数,这显然失败了。

您知道如何定义这种类型的部分专用 class 模板的功能吗?

第二个签名是正确的。

这工作得很好,并用 gcc 产生了预期的结果。

#include <iostream>

template<typename Signature>
class Factory;

template<typename Ret, typename... Args>
class Factory<Ret(Args...)>
{
public:
    Factory();
};


template<typename Ret, typename... Args>
Factory<Ret(Args...)>::Factory()
{
    std::cout << "Hello world" << std::endl;
}

int main()
{
    Factory< int(char, float) > foo;
    return 0;
}