qt從4.6開始,引入了乙個qstringbuilder的內部類
這個類主要使用了乙個被稱為表示式模板(expression templates)的東西。
表示式模板是由todd veldhuizen在2023年6月在一篇文章中給出的。
表示式模板是一種c++模板元程式設計(template metaprogramming)技術。典型情況下,表示式模板自身代表一種操作,模板引數代表該操作的運算元。模板表示式可將子表示式的計算推遲,這樣有利於優化(特別是減少臨時變數的使用)。表示式模板也可以作為引數傳遞給乙個函式。
比如:我們定義了陣列類 array
class arraydouble operator(size_t i) const
size_t size() const
array(size_t n) : _data(n) {}
private:
std::vector_data;
};
但是想實現下面的效果:
void f(const array & a1, const array & a2)
如何做呢?容易想到:過載 operator* 和 operator- 操作符
array operator*(double, const array&);array operator-(const array&, const array&);
...
但這樣一來,會產生很多臨時的array物件,讓人比較難以接受 ...
而表示式模板,允許你寫上面的**,實現的卻是下面的效果:
for (size_t i=0; i b[i] = 10 * (a1[i] - 2 * a2[i]);}
很神奇的東西,可是,它怎麼實現的呢?
我們看看 wikipedia 中的例子(簡化後):
這樣一來,前面表示式**現的子表示式都可以用 arrayexpression 來表示了,然後過載了 operator* 和 operator- 操作符,使得: 10 * a1 和 a1 - a2 的結果分別是 arrayscaled 和arraydifference
#include #include
template class arrayexpression};
class array : public arrayexpressiondouble operator(size_t i) const
size_t size() const
array(size_t n) : _data(n) {}
template array(arrayexpressionconst& vec)
}private:
std::vector_data;
};
template class arraydifference : public arrayexpression>size_t size() const
double operator(size_t i) const
private:
e1 const& _u;
e2 const& _v;
};
template class arrayscaled : public arrayexpression>size_t size() const
double operator(size_t i) const
private:
double _alpha;
e const& _v;
};
template arraydifferenceconst operator-(arrayexpressionconst& u, arrayexpressionconst& v)template arrayscaledconst operator*(double alpha, arrayexpressionconst& v)
int main()array a3 = 10*(a1-2*a2);
for (int i=0; i<10; ++i)
return 0;
}
我們可以通過typeid來看一下表示式的型別:
std::cout<msvc 給出的訊息很容易看:
class arrayscaled> >
gcc給出的比較難看懂
11arrayscaledi15arraydifferencei5arrays_is1_eee0
模板 表示式運算
這些都是emmmm 給出乙個表示式,其中運算子僅包含 要求求出表示式的最終值資料可能會出現括號情況 還有可能出現多餘括號情況資料保證不會出現 maxlongint的資料。資料可能回出現負數情況 2 2 1 1 16真的是超級麻煩emmmm,今天考試的時候看了看接著就棄了。說實話這個真不應該棄掉,但是...
C 學習 lambda表示式
c 中 lambda表示式作為一種內聯函式使用,可以將乙個lambda表示式賦給乙個委託 c 3.0 lambda表示式 是乙個特殊的匿名函式,是一種高效的類似於函式式程式設計的表示式,lambda簡化了開發中需要編寫的 量。它可以包含表示式和語句,並且可用於建立委託或表示式目錄樹型別,支援帶有可繫...
C 學習 Lambda表示式
lambda的形式是 函式物件引數 操作符過載函式引數 某種宣告 例如 mutable 返回值型別 lambda的呼叫方式有兩種,一種是直接在整個lambda表示式後面帶上 因為lambda表示式就是函式指標,函式指標帶上 就是呼叫,另一種是起乙個別名,即使把lambda賦值給乙個變數名,通過變數名...