表示式模板 C 學習

2021-09-07 23:47:49 字數 2413 閱讀 7714

qt從4.6開始,引入了乙個qstringbuilder的內部類

這個類主要使用了乙個被稱為表示式模板(expression templates)的東西。

表示式模板是由todd veldhuizen在2023年6月在一篇文章中給出的。

表示式模板是一種c++模板元程式設計(template metaprogramming)技術。典型情況下,表示式模板自身代表一種操作,模板引數代表該操作的運算元。模板表示式可將子表示式的計算推遲,這樣有利於優化(特別是減少臨時變數的使用)。表示式模板也可以作為引數傳遞給乙個函式。

比如:我們定義了陣列類 array

class array

double 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 arrayexpression

double 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賦值給乙個變數名,通過變數名...