2016-07-10 95 views
0

我想實現一個C++程序,給定一個元素列表,打印出列表中的獨特元素。C++ - 幫助理解功能和類模板之間的差異

我知道C比C++好很多,但我現在開始在C++ 上實際上只有(編碼)。

我只讀過C++概念,模板是什麼,我對函數模板感到滿意,但是我只是讀了類模板,我想我對使用哪一個應用感到困惑到下面的場景。

這是我到目前爲止已經寫(*注意:函數isUnique設置應該是做別的事情,但現在我正在寫裏面只是​​覈實的行動爲):

cppArrays.h

#include <iostream> 
#include <cstdlib> 
#include <vector> 
#include <string> 
using namespace std; 

template <class T> class cpparray{ 
private: 
    int size; 
    vector<T> elems; 
public: 
    cpparray(int); 
    ~ cpparray(); 
    int isUnique(T arr); 
}; 


template <class T> cpparray<T>::cpparray(int size) 
{ 
    vector<T> elems(size); 
    cout << "Object created with size " << elems.size()<< "\n"<< endl; 
} 
template <class T> cpparray<T>::~cpparray() 
{ 
    cout << "Object del\n" << endl; 
} 

template <class T> int cpparray<T>::isUnique(T arr) 
{ 
    return arr.size(); 
} 

cppArrays.cc

#include "cppArrays.h" 

int main() 
{ 
    cpparray<int> a(10) ; 
    //a.push_back(1); 
    //a.push_back(2); 
    //cout << a.size() << a.begin() << a.end() << endl; 
    int b = isUnique(a); 
    return 0; 
} 

詳細

[1]我試圖使用模板,因爲我希望我矢量能夠與任何數據類型被實例化 - 炭/浮點/ INT。

[2]餘認識到,在使用類模板,通過調用

cpparray<int>a(10); 

我最終聲明一個對象類的一個「cpparray」,其類型爲整數。它是否正確? 如果是,那麼a.push_back(1)將無法​​正常工作,因爲它沒有引用成員變量,但對象本身,因此它是可以理解的我會得到一個編譯時錯誤沒有成員名爲push_back在cpparray

但是,這使它更難我

[1]瞭解什麼時候使用模板,而不是功能模板,

[2]如何初始化此矢量在模板類和工作與它,給我的目標?

+0

'push_back'應該存在作爲array'的'的成員函數。然後[this](http://stackoverflow.com/questions/926752/why-should-i-prefer-to-use-member-initialization-list)。你的構造函數中的elems是一個本地實例。 – LogicStuff

+0

正確。但我試圖使用std容器向量,但我搞亂了我嘗試推廣類數組以處理任何類型的數據向量的部分。 – Raaj

+0

我想說的是,在初始化嘗試的情況下,你會搞砸C++入門書中模板之前的部分。並要求*「類模板vs函數模板」*有點像*「class vs function」*。 – LogicStuff

回答

2

你的構造應該使用初始化列表初始化成員,

這樣的:

template <class T> array<T>::array(int sz) : size(sz), elems(sz) 
{ 
    cout << "Object created with size " << elems.size()<< "\n"<< endl; 
} 

你做什麼是聲明向量作爲構造的地方,它初始化大小,和當地矢量在塊的末尾被摧毀。

2

當您需要一個具有編譯時變量屬性的通用類型時,請使用類模板。模板參數可以是類型常數,例如,

template<typename T, size_t Size> 
class MyArray { 
    T elements_[Size]; 
public: 
    MyArray() {} 
    // ... 
}; 

使用函數模板時,希望編寫可應用於各類/參數的泛型函數:

#include <cstdio> 
#include <iostream> 

template<size_t BufSize, typename... Args> 
int strprintf(char(&buf)[BufSize], const char* fmt, Args&&... args) 
{ 
    static_assert(BufSize > 0, "Buffer too small"); 
    static_assert(BufSize < (1 << 31), "Buffer too large"); 
    return snprintf(buf, BufSize, fmt, std::forward<Args>(args)...); 
} 

int main() { 
    char buf[16]; 
    int printed = strprintf(buf, "hello world %s so long", "oversized load"); 
    std::cout << buf << "\n"; 
} 

http://ideone.com/SLUQX3

以上是如何可以替換的例子那些舊的vsnprintf轉發printf類型函數之一;在編譯時做所有的工作使得它更加高效。

BufSize可以由編譯器推導出來,因爲buf的類型是​​;它可以捕獲由參考源,該類型是炭和數組大小 - 模板變量 - 是16.

它也可能有一個模板類的模板的成員函數:

template<typename T> 
class Foo { 
    T t_; 
public: 
    Foo() : t_() {} 
    Foo(const T& t) : t_(t) {} 

    template<typename RhsT> 
    bool is_same_size(const RhsT& rhs) { 
     return t_.size() == rhs.size(); 
    } 
}; 

這例子將只用於例證中工作時T和RhsT的尺寸()成員功能,導致以下:

Foo<vector<int>> fvi; 
Foo<list<double>> fld; 
fvi.is_same_size(fld); // fine 
Foo<int> fi; 
fvi.is_same_size(fi); // compiler error