c++ - 部分专用模板的单独实现

标签 c++ template-specialization

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

为此,我使用了这些 SO 问题中也提到的技术: Function signature-like expressions as C++ template argumentsFunction 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/

相关文章:

c++ - XDG-Shell : how to change window size?

c++ - Qt 调整轴不会调整图表本身

c++ - 避免模​​板特化中的代码重复

c++ - 具有类型转换的模板特化

c++ - 运算符 [] 长版和短版

c++ - 调整 vector vector 的大小会导致段错误

c++ - 我应该声明我的函数模板特化还是定义它们就足够了?

c++ - 在 Doxygen 输出中隐藏模板特化参数

c# - 使用策略模式在 C# 上实现类似行为的多参数 C++ 模板

c++ - vector 、结构和 std::find