广州网站建设gzzhixun,设计平面创意,百度新闻发布,淘宝详情页模板1. 隐式类型名的详情
C20 之前#xff0c;typename 在一些其他情况下是不必要的: • 指定继承类的基类型时 • 在构造函数中将初始值传递给基类时 • 在类声明中使用类型成员时
#include iostream
struct Impl
{Impl(){ std::cout Impl ctor 20 之前typename 在一些其他情况下是不必要的: • 指定继承类的基类型时 • 在构造函数中将初始值传递给基类时 • 在类声明中使用类型成员时
#include iostream
struct Impl
{Impl(){ std::cout Impl ctor std::endl; }
};struct Wrap
{Wrap() { std::cout Wrap ctor std::endl; }using B Impl;
};templatetypename T
struct Test : T::B
{Test(): T::B(){typename T::B impl;std::cout Test ctor std::endl;}
};int main(void)
{TestWrap var;
}自C20 起以下情况为模板形参使用类型成员时可以跳过typename: • 在别名声明中(即使用using 声明类型名称时); 注意带typedef 的类型声明仍然需要typename • 当定义或声明函数的返回类型时(除非声明发生在函数或块范围内) • 声明尾步返回类型时 • 当指定static_cast、const_cast、reinterpret_cast 或dynamic_cast 的目标类型时 • 指定类型时 • 在类中 – 声明数据成员时 – 声明成员函数的返回类型时 – 声明成员函数或友元函数或Lambda 的形参(默认实参可能仍然需要) 时 • 在require 表达式中声明参数类型时 • 为模板的类型参数声明默认值时 • 声明非类型模板形参的类型时
include iostream
#include vector
#include array#define TYPENAMEtemplatetypename 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::arraytypename 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.ctemplatetypename T2 TYPENAME T::value_type//second typename optional ---item 8void assign(T2);
};templatetypename 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_castTYPENAME T::value_type(0); // typename optional ---item 4
}templatetypename T struct Array{static constexpr long MaxSize 100;std::arrayT, MaxSize value;
};
int main(void){MyClassstd::vectorint, Arrayint var;
}