【问题标题】:How to specialize a template constructor templated?如何专门化模板构造函数模板化?
【发布时间】:2017-09-12 00:04:23
【问题描述】:

如何对模板构造函数进行特化? 为了更好的理解,我举个代码例子:

template<typename T>
class Stack {
  private:
    int nelem;
    int size;
    vector<T> stack;

  public:
    ~Stack();
    Stack<T>(int t);
    void push(T data);
    T pop();
    T top();
    int getPosTop(){return (nelem--);};
    void cleanStack(){nelem = 0;};
    bool StackEmpty(){ return (nelem == 0);};
    bool StackFull(){ return (nelem == size);};
};


template <typename T>       // constructor definition here
Stack<T>::Stack<T>(int t){
  size = t;
  nelem = 0;
};

int main(){



return 0;
}

它带有很多错误。 然后,我在另一篇文章中阅读了一些建议,它正在取代

template <typename T>
    Stack<T>::Stack<T>(int t){

template <typename T> template <typename T> Stack<T>::Stack<T> (int t){

这还不够。

我错过了什么?而且,它背后的想法是什么?

【问题讨论】:

  • 你不能专门化构造函数,因为构造函数不是模板。它是类模板的非模板方法。

标签: c++ c++11 templates data-structures


【解决方案1】:

你想知道如何专门化构造函数Stack&lt;T&gt;::Stack 对于T 的特定值。如图所示:-

#include <vector>
#include <iostream>

template<typename T>
class Stack {
private:
    std::size_t nelem;
    std::size_t size;
    std::vector<T> stack;

public:
    ~Stack(){};
    Stack<T>(std::size_t n);
    void push(T data);
    T pop();
    T top();
    std::size_t getPosTop(){return (nelem--);};
    void cleanStack(){nelem = 0;};
    bool StackEmpty(){ return (nelem == 0);};
    bool StackFull(){ return (nelem == size);};
};

template <typename T>
Stack<T>::Stack(std::size_t t){
    size = t;
    nelem = 0;
    std::cout << "Constructing a `Stack<T>`\n";
}

template <>
Stack<std::string>::Stack(std::size_t t){
    size = t;
    nelem = 0;
    std::cout << "Constructing a `Stack<T>` with `T` = `std::string`\n";
}

template <>
Stack<int>::Stack(std::size_t t){
    size = t;
    nelem = 0;
    std::cout << "Constructing a `Stack<T>` with `T` = `int`\n";
}

int main() {
    Stack<float> sf{2};
    Stack<int> si{3};
    Stack<std::string> ss{4};
    sf.cleanStack();
    si.cleanStack();
    ss.cleanStack();
    return 0;
}

哪些输出:-

Constructing a `Stack<T>`
Constructing a `Stack<T>` with `T` == `int`
Constructing a `Stack<T>` with `T` == `std::string`

Live demo

【讨论】:

    【解决方案2】:

    只有你的类是模板,而不是你的构造函数,你应该简单地使用

    template <typename T>
    Stack<T>::Stack(int t){ /*...*/ }
    

    如果你想为 Stack&lt;char&gt; 专门化你的构造函数,那就是

    template <>
    Stack<char>::Stack(int t){ /*...*/ }
    

    【讨论】:

    • 但是,如果我想为不同类型的数据创建不同的构造函数怎么办?因为,你说的意思是Stack&lt;T&gt;(int t);这行不行
    • 您必须扩展该 @Homunculus 。有什么不同?
    • @user4581301 如果我的 Stack 是 int 类型,则构造函数执行 ...(1),或者如果 std::string 执行 ...(2)。一个例子也可以是,如果它是 strings 的堆栈,则构造函数分配内存,但如果是 int,则不是。
    • 然后,您可以使用专门化,根据您的需要,您可以只专门化几个方法或整个类。
    • @Jarod42 但这就是我的问题所在。如果堆栈之间的类型不同,如何专门化构造函数,而不是整个类。这就是我在类定义之前尝试做的,代码示例
    猜你喜欢
    • 2016-07-02
    • 1970-01-01
    • 2015-03-12
    • 1970-01-01
    • 2014-10-01
    • 1970-01-01
    • 2022-12-13
    • 2016-05-03
    • 1970-01-01
    相关资源
    最近更新 更多