部分专用模板的单独实现
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;
}
我正在为 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;
}