템플릿 이해 2

3611 단어 F#
1, typename 키워드:
(1) 템플릿 코드 내부의 어떤 유형이 템플릿 파라미터에 의해 제한되면 typename 키워드를 접두사로 사용해야 한다.
참고: typename 키워드는 템플릿 코드에만 사용됩니다.
(2) typename이 새로운 형식 이름을 만들었다고 생각할 수 없습니다.
typename Seq::iterator ite;
typedef typename Seq::iterator ite;//이것이야말로 새로운 형식 이름을 만드는 것입니다.
인스턴스 코드:

#include <iostream>
#include <vector>
#include <list>
#include <algorithm>
using namespace std;

class SkipGen
{
    int start,step;
public:
    SkipGen(int m=1,int n=3):start(m),step(n){}
    int operator()()
    {
        int temp=start;
        start+=step;
        return temp;
    }
};

template<class T,template<class U,class=allocator<U> > class Seq>
void printSeq(const Seq<T>& seq) //const  const
{
    typename Seq<T>::const_iterator ite;
    for(ite=seq.begin();ite!=seq.end();ite++)
    {
        if(ite==seq.begin())
            cout<<*ite;
        else
            cout<<" "<<*ite;
    }
    cout<<endl;
}

int main()
{
    vector<int> vec(10);
    generate(vec.begin(),vec.end(),SkipGen(1,3));
    printSeq(vec);

    list<int> lst(10);
    generate(lst.begin(),lst.end(),SkipGen(2,2));
    printSeq(lst);

    return 0;
}

2, template 키워드:
"<"은 때때로 번호보다 작다는 것을 의미하며,template는 컴파일러에게 이어서 템플릿 이름을 알려 줍니다.
인스턴스 코드:

#include <iostream>
#include <bitset>
#include <cstddef>
using namespace std;

template<class charT,size_t N>
basic_string<charT> bitSetString(bitset<N> bs)
{
    //      template  .
    return bs.template to_string<charT,char_traits<charT>,allocator<charT> >();
}
// :to_string          ,          .
//basic_string       
//      bitSetString<char>(bs)  bs. template to_string<char,char_traits<char>,allocator<char> >()
int main()
{
    bitset<10> bs;
    bs.set(1),bs.set(5);
    cout<<bs<<endl;

    string str1=bitSetString<char>(bs);
    cout<<str1<<endl;

    string str2=bs.to_string<char,char_traits<char>,allocator<char> >();
    cout<<str2<<endl;
    return 0;
}

3, 템플릿 클래스의 구성원은 템플릿 클래스입니다.
주: 구성원 템플릿 함수는virtual 클래스로 성명할 수 없습니다. 이것은 컴파일러가 하나의 클래스를 해석할 때 허함수표의 크기를 알아야 하기 때문입니다. 만약에 템플릿의 허구성원 함수를 허용한다면 이 템플릿 구성원들이 어디에서 호출되는지 미리 알아야 합니다.
인스턴스 코드:

#include <iostream>
using namespace std;

template<class T>
class Outer
{
public:
    template<class U>
    class Inner
    {
    public:
        void f();
    };
};

template<class T>
template<class U>
void Outer<T>::Inner<U>::f()
{
    cout<<"Outer type=="<<typeid(T).name()<<endl;
    cout<<"Inner type=="<<typeid(U).name()<<endl;
    cout<<"class Inner=="<<typeid(*this).name()<<endl;
}

int main()
{
    Outer<int>::Inner<bool> inner;
    inner.f();
    return 0;
}

좋은 웹페이지 즐겨찾기