专门化一个模板类?

Posted

技术标签:

【中文标题】专门化一个模板类?【英文标题】:Specialize a template class? 【发布时间】:2017-09-18 12:51:20 【问题描述】:

我正在尝试编写一个在没有循环或递归函数调用的情况下输出 1 到 1000 的程序,我想出了这个

#include <iostream>

template <int N>
class NumberGenerator : public NumberGenerator<N-1>
    public:
    NumberGenerator();
;

template <int N>
NumberGenerator<N>::NumberGenerator()
    // Let it implicitly call NumberGenerator<N-1>::NumberGenerator()
    std::cout << N << std::endl;


template <>
NumberGenerator<1>::NumberGenerator()
     // How do I stop the implicit call?
     std::cout << 1 << std::endl;


int main()
    NumberGenerator<1000> a; // Automatically calls the constructor
    return 0;

问题是,我无法停止链式调用(@​​987654322@ 仍然尝试调用NumberGenerator&lt;0&gt; 并无限下溢)。如何让链条停在 1?

【问题讨论】:

【参考方案1】:

专门化类模板本身:

template <int N>
class NumberGenerator : public NumberGenerator<N-1>
    public:
    NumberGenerator();
;

template <>
class NumberGenerator<1> 
    public:
    NumberGenerator();
;

【讨论】:

我能否使用NG&lt;1&gt; 中非专业类的其他功能? IE。 void NG&lt;N&gt;::foo() 是否覆盖 NG&lt;1&gt; 呃。希望这可以帮助? coliru.stacked-crooked.com/a/dabc1b56b56e3848 不,您将无法使用其他功能。要停止链,您必须删除基类。除了 1. 模板元编程(祝你好运) 2. 专业化类模板之外,没有其他办法 @ibug 不,除非您使用多重继承,并将所有常用方法放在基类中。 这是另一种选择,视情况而定。

以上是关于专门化一个模板类?的主要内容,如果未能解决你的问题,请参考以下文章

在派生类中专门化模板成员

如何通过使用可变模板参数来专门化元组的类模板?

如何为矢量专门化一个类模板?

专门化一个模板类?

在类模板中专门化非静态成员是不可能的吗?为啥?

如何编写一个接受每个类和类模板的 C++ 模板?