撫州做網(wǎng)站的公司網(wǎng)站推廣系統(tǒng)方案
1. 隱式類型名的詳情
C++20 之前,typename 在一些其他情況下是不必要的:
? 指定繼承類的基類型時(shí)
? 在構(gòu)造函數(shù)中將初始值傳遞給基類時(shí)
? 在類聲明中使用類型成員時(shí)
#include <iostream>
struct Impl
{Impl(){ std::cout << "Impl ctor" << std::endl; }
};struct Wrap
{Wrap() { std::cout << "Wrap ctor" << std::endl; }using B = Impl;
};template<typename T>
struct Test : T::B
{Test(): T::B(){typename T::B impl;std::cout << "Test ctor" << std::endl;}
};int main(void)
{Test<Wrap> var;
}
自C++20 起,以下情況為模板形參使用類型成員時(shí),可以跳過(guò)typename:
? 在別名聲明中(即,使用using 聲明類型名稱時(shí))? 注意,帶typedef 的類型聲明仍然需要typename
? 當(dāng)定義或聲明函數(shù)的返回類型時(shí)(除非聲明發(fā)生在函數(shù)或塊范圍內(nèi))
? 聲明尾步返回類型時(shí)
? 當(dāng)指定static_cast、const_cast、reinterpret_cast 或dynamic_cast 的目標(biāo)類型時(shí)
? 指定類型時(shí)
? 在類中
– 聲明數(shù)據(jù)成員時(shí)
– 聲明成員函數(shù)的返回類型時(shí)
– 聲明成員函數(shù)或友元函數(shù)或Lambda 的形參(默認(rèn)實(shí)參可能仍然需要) 時(shí)
? 在require 表達(dá)式中聲明參數(shù)類型時(shí)
? 為模板的類型參數(shù)聲明默認(rèn)值時(shí)
? 聲明非類型模板形參的類型時(shí)
include <iostream>
#include <vector>
#include <array>#define TYPENAMEtemplate<typename T,typename U,
auto Size = TYPENAME U::MaxSize,// typename optional --->item 9
auto ValT = typename T::value_type{}> // typename requiredclass MyClass {// first typename optional --->item 6.asecond typename requiredTYPENAME std::array<typename T::value_type,Size> val;
public:using iterator = TYPENAME T::iterator; // typename optional --->item 1TYPENAME T::iterator begin() const; // typename optionalauto end() const ->TYPENAME T::iterator; // typename optional --->item 6.bvoid print(TYPENAME T::iterator) const; // typename optional --->item 6.ctemplate<typename T2 = TYPENAME T::value_type>//second typename optional --->item 8void assign(T2);
};template<typename T>
TYPENAME T::value_type // typename optional --->item 2
foo(const T& cont, typename T::value_type arg) { // typename requiredtypedef typename T::value_type ValT2; // typename required --->item 1using ValT1 = TYPENAME T::value_type; // typename optional --->item 1typename T::value_type val; // typename requiredtypename T::value_type other1(void); // typename requiredauto other2(void) -> TYPENAME T::value_type; // typename optional --->item 3auto l1 = [] (TYPENAME T::value_type) {}; // typename optionalauto p = new TYPENAME T::value_type; // typename optional --->item 5val = static_cast<TYPENAME T::value_type>(0); // typename optional --->item 4
}template<typename T> struct Array{static constexpr long MaxSize = 100;std::array<T, MaxSize> value;
};
int main(void){MyClass<std::vector<int>, Array<int>> var;
}