剖析C++中的常量表达式与省略号的相关作用
C++ 常量表达式
常量表达式中合法的唯一操作数是:
必须将非整型常量(显式或隐式)转换为常量表达式中合法的整型。因此,以下代码是合法的: const double Size = 11.0; char chArray[(int)Size]; 到整型的显式转换在常量表达式中是合法的;所有其他类型和派生类型是非法的(在用作 sizeof 运算符的操作数时除外)。 省略号和可变参数模板 template<typename... Arguments> class classname; 如以下示例所示,对于参数装箱和展开,可以根据您的喜好在省略号周围添加空白,例如: template<typename ...Arguments> class classname; 或为: template<typename ... Arguments> class classname; 请注意本文使用的是显示在第一个例子中约定(该省略号附加于typename). template<typename... Arguments> class vtclass; vtclass< > vtinstance1; vtclass<int> vtinstance2; vtclass<float,bool> vtinstance3; vtclass<long,std::vector<int>,std::string> vtinstance4; 通过使用可变参数模板类定义,您还可以要求至少一个参数。 template <typename First,typename... Rest> class classname; 以下是可变参数模板函数语法的基本示例: template <typename... Arguments> returntype functionname(Arguments... args); 如下一节“了解可变参数模板”所示,Arguments 参数包展开使用。 template <typename... Arguments> returntype functionname(Arguments&... args); template <typename... Arguments> returntype functionname(Arguments&&... args); template <typename... Arguments> returntype functionname(Arguments*... args); 还允许使用类似 const 的说明符: template <typename... Arguments> returntype functionname(const Arguments&... args); 按照可变参数模板类的定义,您可以创建需要至少一个参数的函数: 复制代码 代码如下: template <typename First,typename... Rest> returntype functionname(const First& first,const Rest&... args); 可变模板使用 sizeof...() 运算符(与更早的 sizeof() 运算符不相关): template<typename... Arguments> void tfunc(const Arguments&... args) { const unsigned numargs = sizeof...(Arguments); X xobj[numargs]; // array of some previously defined type X helper_func(xobj,args...); } 更多有关省略号位置 // v1 is NOT a function parameter pack: template <typename... Types> void func1(std::vector<Types...> v1); // v2 IS a function parameter pack: template <typename... Types> void func2(std::vector<Types>... v2); 如果省略号在参数名之后出现,则具有参数 pack 展开。 #include <iostream> using namespace std; void print() { cout << endl; } template <typename T> void print(const T& t) { cout << t << endl; } template <typename First,typename... Rest> void print(const First& first,const Rest&... rest) { cout << first << ","; print(rest...); // recursive call using pack expansion syntax } int main() { print(); // calls first overload,outputting only a newline print(1); // calls second overload // these call the third overload,the variadic template,// which uses recursion as needed. print(10,20); print(100,200,300); print("first",2,"third",3.14159); } Output 1 10,20 100,300 first,third,3.14159 注意 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |