我正在为一个类创建模板,该类应该将函数签名作为模板参数(实际上是该签名的工厂类)。
为此,我使用了这些 SO 问题中也提到的技术: Function signature-like expressions as C++ template arguments和 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(){}
但在这两种情况下,编译器都试图为通用模板而不是专门化定义该函数,这显然失败了。
你知道如何定义这种类型的部分特化类模板的功能吗?
最佳答案
第二个签名是正确的。
这工作得很好,并用 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;
}
关于c++ - 部分专用模板的单独实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57647532/