跳转到内容
主菜单
主菜单
移至侧栏
隐藏
导航
首页
最近更改
随机页面
MediaWiki帮助
代码酷
搜索
搜索
中文(中国大陆)
外观
创建账号
登录
个人工具
创建账号
登录
未登录编辑者的页面
了解详情
贡献
讨论
编辑“︁
C++ 表达式模板
”︁(章节)
页面
讨论
大陆简体
阅读
编辑
编辑源代码
查看历史
工具
工具
移至侧栏
隐藏
操作
阅读
编辑
编辑源代码
查看历史
常规
链入页面
相关更改
特殊页面
页面信息
外观
移至侧栏
隐藏
您的更改会在有权核准的用户核准后向读者展示。
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
=== 示例:向量加法 === 以下是一个简单的表达式模板实现向量加法的示例: <syntaxhighlight lang="cpp"> #include <iostream> #include <vector> // 表达式模板基类 template<typename E> struct VecExpression { double operator[](size_t i) const { return static_cast<const E&>(*this)[i]; } size_t size() const { return static_cast<const E&>(*this).size(); } }; // 具体向量类 class Vec : public VecExpression<Vec> { std::vector<double> data; public: Vec(std::initializer_list<double> init) : data(init) {} double operator[](size_t i) const { return data[i]; } size_t size() const { return data.size(); } // 关键:赋值操作触发表达式计算 template<typename E> Vec& operator=(const VecExpression<E>& expr) { for (size_t i = 0; i < expr.size(); ++i) { data[i] = expr[i]; } return *this; } }; // 加法表达式模板 template<typename E1, typename E2> struct VecAdd : VecExpression<VecAdd<E1, E2>> { const E1& e1; const E2& e2; VecAdd(const E1& e1, const E2& e2) : e1(e1), e2(e2) {} double operator[](size_t i) const { return e1[i] + e2[i]; } size_t size() const { return e1.size(); } }; // 重载+运算符返回表达式模板 template<typename E1, typename E2> VecAdd<E1, E2> operator+(const VecExpression<E1>& e1, const VecExpression<E2>& e2) { return VecAdd<E1, E2>(static_cast<const E1&>(e1), static_cast<const E2&>(e2)); } int main() { Vec v1 = {1.0, 2.0, 3.0}; Vec v2 = {4.0, 5.0, 6.0}; Vec v3 = {0.0, 0.0, 0.0}; v3 = v1 + v2; // 实际计算在此发生 for (size_t i = 0; i < v3.size(); ++i) { std::cout << v3[i] << " "; } // 输出:5 7 9 } </syntaxhighlight>
摘要:
请注意,所有对代码酷的贡献均被视为依照知识共享署名-非商业性使用-相同方式共享发表(详情请见
代码酷:著作权
)。如果您不希望您的文字作品被随意编辑和分发传播,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)