不要試圖獲得仿函式的狀態,或者講不要試圖通過仿函式來確定仿函式的某個值或狀態
試圖從運用了仿函式的演算法中獲得資料或者結果的方式有兩種,分別是顯式寫出傳遞的型別引數,使用引用。如下面的:
listcoll;
intsequence seq(3);
generate_n>,int,intsequence&>(back_inserter(coll),4,seq);
或者使用for_each演算法,返回乙個仿函式的copy~:
int array[10]=;
for_each(array,array+9,add1);
這是原生指標的情況。
這兩種情況,第二種限定了演算法。
對於第一種,有乙個很大的問題,那就是不同編譯環境其stl庫的對應演算法實現是不同的!這造成第一種情況在有些ide中無法實現!
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
class intsequence
int operator()()
這個情況下,你會發現在vs2010vs2012上,這個seq並沒有按照我們想的那樣,按引用傳遞,我們可以重用修改後的seq。
但是這個情況在codeblock上就完全不一樣了!
這是為什麼呢。如果我們自己實現intsequence的拷貝建構函式,你就會發現如下問題
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
class intsequence
int operator()()
你會發現,在這裡多次呼叫了拷貝建構函式,這是為什麼呢。
而當這段**在codeblock上執行時,又沒呼叫拷貝建構函式。
這是因為vs和codeblock上面的對stl的實現不同
首先,來看拷貝建構函式的作用
我們寫這麼乙個類a
class a
template
void func(t t)
int main()
可以看到,傳入的引用立刻被使用為__gen()用於產生乙個插入值,然後通過*來獲得back_inserter本身,然後通過過載的=運算子中實現插入
在vs中的generate_n的實現,首先呼叫
template inline
_outit generate_n(_outit _dest, _diff _count, _fn0 _func)
然後呼叫
template inline
_outit _generate_n(_outit _dest, _diff _count, _fn0 _func,
true_type)
然後呼叫
template inline
_outit _generate_n1(_outit _dest, _diff _count, _fn0 _func,
output_iterator_tag)
然後呼叫
template inline
_outit _generate_n(_outit _dest, _diff _count, _fn0 _func)
一共3次間接呼叫,並且沒有顯式傳遞引用引數,這表示即使開始我們使用顯式的引用引數傳遞,在3次間接呼叫之後,也會呼叫3次拷貝建構函式,並且最終的實現使用的僅僅是乙個原傳入物件的副本。所以我們無法獲得vs中仿函式的狀態變化。
getline函式的一些問題
getline 的原型是 istream getline istream is string str char delim 其中 istream is 表示乙個輸入流,譬如cin string str表示把從輸入流讀入的字串存放在這個字串中 可以自己隨便命名,str什麼的都可以 char delim...
函式過載的一些問題
面試問題 void fun int,double void fun double,int 現在呼叫fun int int 會怎麼樣?函式過載的匹配過程有三步 1 確定候選函式,兩個原則 1 函式名相同 2 在呼叫點函式可見。顯然對於該題目來說兩個函式都是候選函式。2 確定可行函式,也是有兩個原則 1...
箭頭函式的一些問題
在普通函式中,this指向根據其使用場景不同改變。而箭頭函式中的this始終指向其父級作用域 var person p 此時的this並不是指向例項物件,而是指向父級作用域,指向window,所以不能作為建構函式 如果想要實現不定引數的呼叫,就使用.剩餘引數實現 var sayhi b consol...