Expression Templates 是一种 C++ 模板元编程技术,它通过在编译时构建按需执行的计算表达式,从而生成高效的代码。简单来说,通过 Expression Templates,我们可以实现惰性求值和消除因为中间结果而创建的临时变量。
我们构造了一个MyVector类,并且重载了MyVector的+和*操作符,实现两个MyVector中相同下标元素的+和*操作。
对于这样的需求我们很容易写出形如下面代码的一个简单的实现:
#include <cassert>
#include <iostream>
#include <vector>
template<typename T> class MyVector
{
public:
MyVector(const std::size_t n)
: vec_(n)
{}
MyVector(const std::size_t n, const T initvalues)
: vec_(n, initvalues)
{}
std::size_t size() const { return vec_.size(); }
T operator[](const std::size_t i) const
{
assert(i < size());
return vec_[i];
}
T& operator[](const std::size_t i)
{
assert(i < size());
return vec_[i];
}
private:
std::vector<T> vec_;
};
template<typename T> MyVector<T> operator+(const MyVector<T>& a, const MyVector<T>& b)
{
assert(a.size() == b.size());
MyVector<T> result(a.size());
for (std::size_t i = 0; i < a.size(); ++i) {
result[i] = a[i] + b[i];
}
return result;
}
template<typename T> MyVector<T> operator*(const MyVector<T>& a, const MyVector<T>& b)
{
assert(a.size() == b.size());
MyVector<T> result(a.size());
for (std::size_t i = 0; i < a.size(); ++i) {
result[i] = a[i] * b[i];
}
return result;
}
template<typename T> std::ostream& operator<<(std::ostream& os, const MyVector<T>& vec)
{
std::cout << '\n';
for (std::size_t i = 0; i < vec.size(); ++i) {
os << vec[i] << ' ';
}
os << '\n';
return os;
}
int main(int argc, char* argv[])
{
MyVector<double> x(10, 5.4);
MyVector<double> y(10, 10.3);
auto ret = x + x + y * y;
std::cout << ret << std::endl;
return 0;
}
这个实现平淡无奇,相信每个人都能随手写出来。在godbolt上编译成汇编来分析: