青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

天秤座的唐風

總會有一個人需要你的分享~!- 唐風 -

  C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
  13 隨筆 :: 0 文章 :: 69 評論 :: 0 Trackbacks

這兩天寫代碼,遇到這么一個模板決議的問題:
    有一個類 A,其中有兩個數(shù)據(jù)成員(方便起見都是 public )。為了從其它部分(比如文件)讀入數(shù)據(jù),我為 A 類重載了輸入流操作符。代碼如下所示:
程序1

typedef struct tagA {
    UINT32  biSize;
    UINT32  biCount;
}
 A;

template 
<typename DataStream>
DataStream
& operator>>(DataStream& a_data, A& a_fileHeader)
{        
    a_data
>>a_fileHeader.biSize>>a_fileHeader.biCount;

    
return a_data;        
}


    一般使用標準IO流的話,這樣做至少在編譯上是沒有問題的(讀二進制文件不行,后有補充)。
    在我的程序中,我目前只是測試時用文件讀取,到后期,肯定會換成其它形式(可能是直接大塊類似的數(shù)據(jù)整在一起,放在內存中之類),所以我打算為數(shù)據(jù)源寫一個包裝類,在目前的階段,直接轉到標準IO文件讀取,后期再修改數(shù)據(jù)源類。因為使用數(shù)據(jù)源類需要保持與標準IO的寫法一致( cin>>xx ),所以這個類要為每種基本類型重載輸入流操作符。這些重載的代碼結構都是一樣的,只是數(shù)據(jù)類型不同,因此用模板是最好的,所以一開始,我寫成了下面這個樣子:
程序2

class DataFromFile
{
public:
    DataFromFile(CHAR 
const *a_fileName)
        :dataStream(a_fileName, std::ios::binary
|std::ios::in)
    
{ assert(dataStream.good());}
    
~DataFromFile() 
    
{ dataStream.close();}
public:
    template 
<typename T>
    inline DataFromFile
& operator>> (T& a_data)        
    
{                                                  
        dataStream.read((CHAR 
*)&a_data, sizeof(T));   
        
return *this;                                     
    }

private:
    std::fstream dataStream;
}
;


    但在實際使用時,像下面的語句,就發(fā)生了編譯問題:

DataFromFile source("11.bin");
A dest;
source
>>dest; 


    編譯器對這段代碼抱怨,說無法確定使用哪個模板……
    當然,我是希望編譯器在這里使用程序一中的非成員模板函數(shù),然后在那個模板函數(shù)中,再用程序2中的成員模板函數(shù)來實例化基本類型的輸入操作??墒蔷幾g器沒有這么智能,我理解,這里用A做模板參數(shù)的話,確實有二義性。
    想來想去沒想到好的辦法消除這種二義性,只好修改代碼,去掉其中一個的模板定義。類比地思考一下,標準IO并沒有發(fā)生這個問題,因為標準IO的輸入流操作并不是模板函數(shù),而這里的DataFromFile類,明顯使用模板會比較優(yōu)雅,但二義性的問題不知道怎么解決。最后沒辦法,改成用宏來實現(xiàn),代碼如下:
程序3

#define InputForBuildIn(Type)                         \
inline DataFromFile
& operator>> (Type& a_data)        \
{                                                     \
    dataStream.read((CHAR 
*)&a_data, sizeof(Type));   \
    
return *this;                                     \
}


class DataFromFile
{
public:
    DataFromFile(CHAR 
const *a_fileName)
        :dataStream(a_fileName, std::ios::binary
|std::ios::in)
    
{ assert(dataStream.good());}
    
~DataFromFile() 
    
{ dataStream.close();}
public:
    InputForBuildIn(INT8)
    InputForBuildIn(UINT8)
    InputForBuildIn(INT16)
    InputForBuildIn(UINT16)
    InputForBuildIn(INT32)
    InputForBuildIn(UINT32)
private:
    std::fstream dataStream;
}
;


    問題是沒有了,但總覺得不是滋味。(不知道有沒有更好的解決辦法?哪位大俠指點下?)


PS:
    對 C++ 的標準 IO 流還不熟,在以二進制方式打開文件時,使用 >> 操作符無法讀入數(shù)據(jù)?一開始的時候調了很久,后來才發(fā)現(xiàn)這里可能有問題,轉成使用 .read() 方法來讀數(shù)據(jù),就成功了。標準 IO 還是得好好再補補啊。

posted on 2009-06-28 12:01 唐風 閱讀(780) 評論(7)  編輯 收藏 引用 所屬分類: 語言技術

評論

# re: 輸入流函數(shù)模板決議問題導致程序不簡潔 2009-11-15 03:54 OwnWaterloo
沒辦法…… 讓它吃點虧好了:
template <typename DataStream>
DataStream& operator>>(DataStream& a_data, A& a_fileHeader);

該成這樣:
template<typename C,class T>
std::basic_istream<C,T>& operator>>(std::basic_istream<C,T>& s,A& a);

這也是為iostream寫擴展時要考慮的一個問題:
1. 要么嚴格使用標準庫中的(w)i(f/string)stream,basic_i(f/string)stream
2. 要么放寬,使用任意重載了>>的。



二進制和文本關系到是否轉換換行模式。

寫入文件時是怎么寫的?
>>和<<是格式化輸出。
read/write是非格式化輸出。
12
<<結果就是 '1','2' , >>時也希望是這樣
write結果就是 0c,00,00,00, read時也希望是這樣。

  回復  更多評論
  

# re: 輸入流函數(shù)模板決議問題導致程序不簡潔 2009-11-21 12:53 唐風
居然發(fā)現(xiàn) SFINAE 正是我要的解決方案~!
后來試了一下下面這段實現(xiàn),就 OK 了……
 
class DataFromFile
{
public:
    DataFromFile(
char const *a_fileName)
        :dataStream(a_fileName, std::ios::binary
|std::ios::in)
    
{ assert(dataStream.good());}
    
~DataFromFile() 
    
{ dataStream.close();}
public:
    template 
<typename T> inline
    typename boost::disable_if
<boost::is_class<T>, DataFromFile&>::type 
    
operator>> (T& a_data)        
    
{                                                  
        dataStream.read((
char *)&a_data, sizeof(T));   
        
return *this;                                     
    }

private:
    std::fstream dataStream;
}
;
 
必須要贊一下 boost 的 enable_if ,確實是應用 SFINAE 相當優(yōu)雅的一種方式~!
 
你的回復中對于輸入輸出流的解釋,我還是不太理解,呵呵,要學的東西真多哇,C++ 的 IO 流和 IO 流的本地化是我比較“恐懼”的部分。有沒有什么好庫可以代替?
對于學習這塊,你有什么好的推薦?
 
 
  回復  更多評論
  

# re: 輸入流函數(shù)模板決議問題導致程序不簡潔 2009-11-21 14:30 OwnWaterloo
@唐風
這方法好,學習了~

我覺得《the c++ programming language》中21章將流的架構講得很清楚。
具體實現(xiàn)么。。。
有2本書可能有這方面的內容,我沒細看……
1本是《C++ Templates》
1本是《標準C++輸入輸出流與本地化》
http://www.china-pub.com/3274


代替io流么…… 有個iconv可以做編碼轉換。
代替io流的場合我沒遇見過……
其實我對很多項目都要自己寫一個log模塊很不理解……
沒往這方面想過……

  回復  更多評論
  

# re: 輸入流函數(shù)模板決議問題導致程序不簡潔 2009-11-21 17:32 唐風
@OwnWaterloo
謝謝推薦,說起來,C++ 的書讀了不少,不過 BS 老爺子的《the c++ programming language》還真是沒看過……慚愧,回頭找來啃一啃。
《標準C++輸入輸出流與本地化》這本書看了前兩章都看不下去了,實在有點無趣,倒是《C++ standard library》中IO部分看幾回,但本地化還是沒搞明白。

PS:
說到 log 模塊,覺得還是蠻有用的,就現(xiàn)在手頭上做的項目來說,如果沒有這東西,所有模塊的 log 信息不受任何控制的話,光是這些 log 的通信就能把機器卡死(因為機器與PC的是串口連的)……
覺得對于大一點的軟件(雖然我只接觸了一個)來說,系統(tǒng)自身的調試機能和控制都蠻重要。  回復  更多評論
  

# re: 輸入流函數(shù)模板決議問題導致程序不簡潔 2009-11-21 18:04 OwnWaterloo
@唐風
C++老豆的書得看~_~ 確實是對C++理解最深的人。
本地化在《TC++PL》的附錄(好像特別版才有附錄)中有,不過好像沒想象中的那么好用……


關于log…… 特指debug log 我不是說它的效率…… 而是為什么需要這種東西……
我的想法是,能測試就不要用調試器,能用調試器就不要寫debug log,只有不得已的時候,才會用那個東西。
為什么不把bug都查出來?
而是將它隱藏到軟件中,等它出現(xiàn)后 —— 交付給用戶使用后 —— 再從debug log中研究哪出的bug?

當然,我也沒什么大型軟件的經驗,也沒有用戶邏輯復雜的軟件的經驗……
可能那時候會理解debug log的用處……

  回復  更多評論
  

# re: 輸入流函數(shù)模板決議問題導致程序不簡潔 2009-11-22 14:40 OwnWaterloo
@唐風
后來又回味了一下,用SFINAE,故意讓使用某些類型實例化模板時產生錯誤,從而從重載候選中剔除,確實是一個很好的辦法~_~

boost的enable_if也確實抓住并滿足了大量需求。

好東西啊,再回味回味...

  回復  更多評論
  

# re: 輸入流函數(shù)模板決議問題導致程序不簡潔 2009-11-22 15:38 唐風
@OwnWaterloo
是的啊,正好我也在“回味”,哈哈,準備作為那篇 SFINAE 隨筆的補充,加一些 enable_if 的筆記……

對于 enable_if 的還有一個比較舒服的功能點是:
boost::disable_if<boost::is_class<T>, DataFromFile&>::type
這個可以放返回值的位置上生效,并且讓條件滿足時使用DataFromFile&作為返回類型,其它情況下讓它 Substitution fail,而不對程序產生“負面影響”。

真是非常體貼啊,因為在這個地方,運算符重載的參數(shù)個數(shù)是有限制的,不能隨意增加,所以在這里不能直接在參數(shù)表中加 T::* p = 0 之類的東西來運用 SFINAE。


  回復  更多評論
  

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            玖玖玖国产精品| 在线精品在线| 香蕉久久a毛片| 亚洲视频精品| 亚洲一区二区在线观看视频| 日韩小视频在线观看| 欧美手机在线| 国产精品美女久久福利网站| 欧美日韩妖精视频| 国产精品国产精品| 国内精品亚洲| 亚洲高清久久网| 亚洲免费播放| 午夜免费在线观看精品视频| 香蕉久久a毛片| 亚洲高清视频的网址| 亚洲人线精品午夜| 欧美一区二区三区免费在线看| 欧美午夜激情视频| 欧美国产日产韩国视频| 亚洲欧美日韩精品久久久| 欧美大香线蕉线伊人久久国产精品| 亚洲免费视频在线观看| 亚洲欧美在线另类| 亚洲人成毛片在线播放女女| 亚洲人成网站影音先锋播放| 亚洲精品国产精品乱码不99按摩| 日韩香蕉视频| 久久九九热免费视频| 免费成人高清视频| 9色国产精品| 久久九九全国免费精品观看| 欧美另类videos死尸| 国产日产欧产精品推荐色| 亚洲福利免费| 亚洲自拍偷拍麻豆| 亚洲大片在线观看| 国产精品99久久久久久久vr| 久久精品国产精品| 欧美午夜不卡视频| 亚洲风情亚aⅴ在线发布| 亚洲网站在线播放| 欧美激情国产日韩精品一区18| 一本久久精品一区二区| 久久久久国产一区二区三区| 国产精品videosex极品| 亚洲国产一区视频| 久久免费视频网站| 亚洲一区二区动漫| 欧美激情影音先锋| 亚洲三级视频| 欧美成人精品一区| 翔田千里一区二区| 国产精品久久久91| 亚洲视频一区二区在线观看| 欧美va亚洲va日韩∨a综合色| 亚洲欧美精品在线观看| 欧美网站在线观看| 亚洲一区二区三区精品在线| 亚洲人成亚洲人成在线观看| 久久色中文字幕| 亚洲成人直播| 欧美成人一品| 久久婷婷影院| 亚洲丰满在线| 亚洲欧洲另类| 欧美精品91| 亚洲精品中文字幕有码专区| 免费欧美视频| 另类春色校园亚洲| 麻豆成人小视频| 欧美国产激情二区三区| 亚洲深夜福利在线| 亚洲精品一区二区三区福利| 欧美三区在线视频| 美女网站在线免费欧美精品| 国产精品久久久久一区二区三区| 久久福利毛片| 美女视频黄 久久| 欧美精品一区二区在线播放| 亚洲在线观看| 可以看av的网站久久看| 久久亚洲高清| 亚洲制服欧美中文字幕中文字幕| 亚洲精品裸体| 国产三级欧美三级日产三级99| 久久久国产精品一区| 夜夜狂射影院欧美极品| 欧美在线视频导航| 伊人婷婷欧美激情| 性18欧美另类| 午夜精品久久久久久久蜜桃app| 欧美一区亚洲二区| 欧美激情精品久久久久久黑人| 亚洲风情亚aⅴ在线发布| 一本色道久久综合精品竹菊| 性18欧美另类| 欧美日本在线| 久久综合狠狠综合久久综青草| 欧美人与禽猛交乱配| 欧美成人福利视频| 国产日韩欧美一二三区| 99精品欧美一区二区三区综合在线| 亚洲一区二区三区久久| 欧美成ee人免费视频| 亚洲曰本av电影| 久久精品免视看| 久久欧美中文字幕| 极品av少妇一区二区| 亚洲一区二区三区激情| 欧美亚洲免费在线| 永久免费毛片在线播放不卡| 欧美日韩精品国产| 国产精品99久久久久久久久| 欧美色视频日本高清在线观看| 午夜精品剧场| 欧美第一黄网免费网站| 欧美自拍偷拍| 欧美日韩综合精品| 欧美二区视频| 激情综合亚洲| 亚洲永久精品国产| 在线视频日本亚洲性| 久久精品国产欧美亚洲人人爽| 亚洲午夜激情免费视频| 久久影院午夜片一区| 亚洲自拍偷拍一区| 欧美日韩大片一区二区三区| 美女日韩在线中文字幕| 国产视频综合在线| 亚洲综合国产| 午夜精品久久久久久99热软件 | 国产精品99久久久久久久久| 久久男人资源视频| 久久精品系列| 午夜免费久久久久| 在线看一区二区| 久久精品国产一区二区三| 欧美影片第一页| 国产精品视频你懂的| 一区二区三区欧美| 亚洲天堂av高清| 欧美视频日韩视频在线观看| 亚洲精品一二| 亚洲午夜精品久久久久久浪潮 | 欧美成人免费大片| 亚洲国产精品视频一区| 久久婷婷丁香| 欧美激情五月| 99国产一区| 国产精品超碰97尤物18| 亚洲自拍偷拍视频| 久久综合九色九九| 亚洲国产精品成人综合色在线婷婷| 久久精品伊人| 亚洲国产精品www| 一区二区日韩伦理片| 欧美日韩一区三区四区| 亚洲欧美国产不卡| 免费观看成人| 在线视频欧美一区| 国产色视频一区| 欧美日韩一区二区三区高清| 欧美日韩免费高清| 国产一区在线视频| 亚洲毛片视频| 亚洲欧美日韩久久精品| 理论片一区二区在线| 亚洲精品美女| 久久成人亚洲| 国产麻豆日韩| 久久午夜精品| 国产精品男人爽免费视频1| 性色av一区二区三区红粉影视| 久久婷婷国产麻豆91天堂| 亚洲精选中文字幕| 国产精品视频免费在线观看| 久久日韩粉嫩一区二区三区| 一本久久a久久免费精品不卡| 久久久精品动漫| 亚洲视频1区2区| 在线国产精品播放| 国产精品露脸自拍| 欧美1区2区3区| 欧美一区二区三区视频在线| 亚洲韩国青草视频| 久久久噜噜噜久久人人看| 一区二区欧美在线| 亚洲成色777777女色窝| 国产精品久久久久影院亚瑟| 麻豆成人综合网| 欧美一级理论性理论a| 亚洲品质自拍| 欧美成人免费网| 久久久久一区二区| 欧美伊人久久| 午夜欧美大尺度福利影院在线看| 亚洲美女免费精品视频在线观看| 精品电影一区| 国内精品久久国产|