템플릿 이해 2
3611 단어 F#
(1) 템플릿 코드 내부의 어떤 유형이 템플릿 파라미터에 의해 제한되면 typename 키워드를 접두사로 사용해야 한다.
참고: typename 키워드는 템플릿 코드에만 사용됩니다.
(2) typename이 새로운 형식 이름을 만들었다고 생각할 수 없습니다.
typename Seq
typedef typename Seq
인스턴스 코드:
#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;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
F#에서 Android 앱 개발 Helloworld 편F#에서 android 앱 개발의 기본이되는 Helloworld를 출력하는 방법을 소개합니다. 먼저 Visual Studio 2019를 시작합니다. [새 프로젝트 만들기(N)]→[빈 앱(Android)]을 선택합니다...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.