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

天秤座的唐風(fēng)

總會(huì)有一個(gè)人需要你的分享~!- 唐風(fēng) -

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

這兩天寫(xiě)代碼,遇到這么一個(gè)模板決議的問(wèn)題:
    有一個(gè)類 A,其中有兩個(gè)數(shù)據(jù)成員(方便起見(jiàn)都是 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;        
}


    一般使用標(biāo)準(zhǔn)IO流的話,這樣做至少在編譯上是沒(méi)有問(wèn)題的(讀二進(jìn)制文件不行,后有補(bǔ)充)。
    在我的程序中,我目前只是測(cè)試時(shí)用文件讀取,到后期,肯定會(huì)換成其它形式(可能是直接大塊類似的數(shù)據(jù)整在一起,放在內(nèi)存中之類),所以我打算為數(shù)據(jù)源寫(xiě)一個(gè)包裝類,在目前的階段,直接轉(zhuǎn)到標(biāo)準(zhǔn)IO文件讀取,后期再修改數(shù)據(jù)源類。因?yàn)槭褂脭?shù)據(jù)源類需要保持與標(biāo)準(zhǔn)IO的寫(xiě)法一致( cin>>xx ),所以這個(gè)類要為每種基本類型重載輸入流操作符。這些重載的代碼結(jié)構(gòu)都是一樣的,只是數(shù)據(jù)類型不同,因此用模板是最好的,所以一開(kāi)始,我寫(xiě)成了下面這個(gè)樣子:
程序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;
}
;


    但在實(shí)際使用時(shí),像下面的語(yǔ)句,就發(fā)生了編譯問(wèn)題:

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


    編譯器對(duì)這段代碼抱怨,說(shuō)無(wú)法確定使用哪個(gè)模板……
    當(dāng)然,我是希望編譯器在這里使用程序一中的非成員模板函數(shù),然后在那個(gè)模板函數(shù)中,再用程序2中的成員模板函數(shù)來(lái)實(shí)例化基本類型的輸入操作。可是編譯器沒(méi)有這么智能,我理解,這里用A做模板參數(shù)的話,確實(shí)有二義性。
    想來(lái)想去沒(méi)想到好的辦法消除這種二義性,只好修改代碼,去掉其中一個(gè)的模板定義。類比地思考一下,標(biāo)準(zhǔn)IO并沒(méi)有發(fā)生這個(gè)問(wèn)題,因?yàn)闃?biāo)準(zhǔn)IO的輸入流操作并不是模板函數(shù),而這里的DataFromFile類,明顯使用模板會(huì)比較優(yōu)雅,但二義性的問(wèn)題不知道怎么解決。最后沒(méi)辦法,改成用宏來(lái)實(shí)現(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;
}
;


    問(wèn)題是沒(méi)有了,但總覺(jué)得不是滋味。(不知道有沒(méi)有更好的解決辦法?哪位大俠指點(diǎn)下?)


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

posted on 2009-06-28 12:01 唐風(fēng) 閱讀(785) 評(píng)論(7)  編輯 收藏 引用 所屬分類: 語(yǔ)言技術(shù)

評(píng)論

# re: 輸入流函數(shù)模板決議問(wèn)題導(dǎo)致程序不簡(jiǎn)潔 2009-11-15 03:54 OwnWaterloo
沒(méi)辦法…… 讓它吃點(diǎn)虧好了:
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寫(xiě)擴(kuò)展時(shí)要考慮的一個(gè)問(wèn)題:
1. 要么嚴(yán)格使用標(biāo)準(zhǔn)庫(kù)中的(w)i(f/string)stream,basic_i(f/string)stream
2. 要么放寬,使用任意重載了>>的。



二進(jìn)制和文本關(guān)系到是否轉(zhuǎn)換換行模式。

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

  回復(fù)  更多評(píng)論
  

# re: 輸入流函數(shù)模板決議問(wèn)題導(dǎo)致程序不簡(jiǎn)潔 2009-11-21 12:53 唐風(fēng)
居然發(fā)現(xiàn) SFINAE 正是我要的解決方案~!
后來(lái)試了一下下面這段實(shí)現(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 ,確實(shí)是應(yīng)用 SFINAE 相當(dāng)優(yōu)雅的一種方式~!
 
你的回復(fù)中對(duì)于輸入輸出流的解釋,我還是不太理解,呵呵,要學(xué)的東西真多哇,C++ 的 IO 流和 IO 流的本地化是我比較“恐懼”的部分。有沒(méi)有什么好庫(kù)可以代替?
對(duì)于學(xué)習(xí)這塊,你有什么好的推薦?
 
 
  回復(fù)  更多評(píng)論
  

# re: 輸入流函數(shù)模板決議問(wèn)題導(dǎo)致程序不簡(jiǎn)潔 2009-11-21 14:30 OwnWaterloo
@唐風(fēng)
這方法好,學(xué)習(xí)了~

我覺(jué)得《the c++ programming language》中21章將流的架構(gòu)講得很清楚。
具體實(shí)現(xiàn)么。。。
有2本書(shū)可能有這方面的內(nèi)容,我沒(méi)細(xì)看……
1本是《C++ Templates》
1本是《標(biāo)準(zhǔn)C++輸入輸出流與本地化》
http://www.china-pub.com/3274


代替io流么…… 有個(gè)iconv可以做編碼轉(zhuǎn)換。
代替io流的場(chǎng)合我沒(méi)遇見(jiàn)過(guò)……
其實(shí)我對(duì)很多項(xiàng)目都要自己寫(xiě)一個(gè)log模塊很不理解……
沒(méi)往這方面想過(guò)……

  回復(fù)  更多評(píng)論
  

# re: 輸入流函數(shù)模板決議問(wèn)題導(dǎo)致程序不簡(jiǎn)潔 2009-11-21 17:32 唐風(fēng)
@OwnWaterloo
謝謝推薦,說(shuō)起來(lái),C++ 的書(shū)讀了不少,不過(guò) BS 老爺子的《the c++ programming language》還真是沒(méi)看過(guò)……慚愧,回頭找來(lái)啃一啃。
《標(biāo)準(zhǔn)C++輸入輸出流與本地化》這本書(shū)看了前兩章都看不下去了,實(shí)在有點(diǎn)無(wú)趣,倒是《C++ standard library》中IO部分看幾回,但本地化還是沒(méi)搞明白。

PS:
說(shuō)到 log 模塊,覺(jué)得還是蠻有用的,就現(xiàn)在手頭上做的項(xiàng)目來(lái)說(shuō),如果沒(méi)有這東西,所有模塊的 log 信息不受任何控制的話,光是這些 log 的通信就能把機(jī)器卡死(因?yàn)闄C(jī)器與PC的是串口連的)……
覺(jué)得對(duì)于大一點(diǎn)的軟件(雖然我只接觸了一個(gè))來(lái)說(shuō),系統(tǒng)自身的調(diào)試機(jī)能和控制都蠻重要。  回復(fù)  更多評(píng)論
  

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


關(guān)于log…… 特指debug log 我不是說(shuō)它的效率…… 而是為什么需要這種東西……
我的想法是,能測(cè)試就不要用調(diào)試器,能用調(diào)試器就不要寫(xiě)debug log,只有不得已的時(shí)候,才會(huì)用那個(gè)東西。
為什么不把bug都查出來(lái)?
而是將它隱藏到軟件中,等它出現(xiàn)后 —— 交付給用戶使用后 —— 再?gòu)膁ebug log中研究哪出的bug?

當(dāng)然,我也沒(méi)什么大型軟件的經(jīng)驗(yàn),也沒(méi)有用戶邏輯復(fù)雜的軟件的經(jīng)驗(yàn)……
可能那時(shí)候會(huì)理解debug log的用處……

  回復(fù)  更多評(píng)論
  

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

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

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

  回復(fù)  更多評(píng)論
  

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

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

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


  回復(fù)  更多評(píng)論
  

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美资源在线观看| 亚洲欧美伊人| 欧美日韩伦理在线| 欧美大学生性色视频| 欧美成人国产va精品日本一级| 久久久免费观看视频| 久久尤物视频| 欧美激情第二页| 久久久www免费人成黑人精品| 欧美freesex交免费视频| 久久精品国产欧美亚洲人人爽| 欧美在线一二三区| 久久亚洲春色中文字幕| 欧美精品久久99| 国产精品久久久久免费a∨| 国产欧美精品一区| 亚洲国产精品传媒在线观看 | 亚洲永久在线| 久久精品一二三| 欧美人成免费网站| 国产欧美日本| 亚洲毛片av| 久久精品免费电影| 99精品黄色片免费大全| 久久久久高清| 国产精品一区二区久久久| 亚洲电影av在线| 欧美在线资源| 99精品视频免费全部在线| 久久久国产精品亚洲一区| 欧美日韩精品一二三区| 亚洲国产精品热久久| 久久国产精品久久精品国产| 99re成人精品视频| 欧美sm视频| 一区二区三区在线观看欧美| 亚洲制服少妇| 亚洲精品免费一二三区| 亚洲欧美日产图| 欧美日韩一区三区四区| 亚洲人成人77777线观看| 久久婷婷麻豆| 亚洲欧美激情诱惑| 国产精品福利影院| 亚洲少妇最新在线视频| 欧美激情一区二区三区成人 | 欧美日韩中文在线| 亚洲第一精品福利| 久久综合给合久久狠狠色| 亚洲在线黄色| 国产精品乱码妇女bbbb| 亚洲婷婷在线| 日韩视频在线免费观看| 欧美激情第4页| 日韩天堂在线视频| 亚洲免费观看在线视频| 欧美日韩成人| 制服丝袜亚洲播放| 在线视频一区观看| 国产精品美女主播在线观看纯欲| 亚洲一区在线播放| 亚洲一区久久久| 亚洲精品在线看| 欧美日韩高清不卡| 欧美a一区二区| 欧美成人免费全部观看天天性色| 亚洲欧洲另类| 亚洲欧美日本国产有色| 久久久女女女女999久久| 亚洲日本久久| 在线不卡中文字幕| 噜噜噜躁狠狠躁狠狠精品视频| 亚洲欧美日韩视频一区| 国产精品久久久久7777婷婷| 国产一区三区三区| 狼人社综合社区| 一区二区三区你懂的| 午夜精品偷拍| 国产精品va在线| 亚洲国产日韩欧美一区二区三区| 亚洲欧美一区二区精品久久久| 欧美在线视频一区二区三区| 你懂的视频一区二区| 国产精品美女999| 欧美国产一区二区三区激情无套| 欧美高潮视频| 久久久99国产精品免费| 国产精品久久看| 99精品国产热久久91蜜凸| 久久综合九色综合久99| 国产女主播一区二区| 亚洲精品一区二区在线| 亚洲欧美日本国产专区一区| 国产精品成人一区二区网站软件| 在线观看亚洲视频| 久久一区欧美| 久久久av网站| 久久精品国产在热久久| 国产精品久久久久久久久果冻传媒 | 欧美一区二区三区喷汁尤物| 亚洲黄色影院| 欧美日韩亚洲91| 一本色道久久88精品综合| 久久超碰97人人做人人爱| 欧美激情一区三区| 欧美成人午夜免费视在线看片 | 亚洲一区二区三区在线视频| 激情久久久久久久| 中日韩美女免费视频网站在线观看| 国产一区二区三区四区老人| 亚洲片在线资源| 国产一区99| 日韩午夜三级在线| 樱桃国产成人精品视频| 亚洲尤物视频网| 亚洲视频一区二区| 欧美成人午夜激情在线| 久久精品国产免费| 国产精品国产三级欧美二区| 亚洲丶国产丶欧美一区二区三区| 国产精品综合| 一区二区三区四区蜜桃| 亚洲精品裸体| 蜜桃伊人久久| 久久影院亚洲| 狠色狠色综合久久| 午夜久久影院| 久久精品国产69国产精品亚洲 | 亚洲日本欧美| 亚洲国产经典视频| 久久成人免费视频| 先锋影音久久久| 欧美日韩直播| 亚洲少妇一区| 亚洲一区黄色| 欧美日韩亚洲综合在线| 亚洲激情社区| 亚洲最新色图| 欧美日韩国产专区| 一本一本久久a久久精品牛牛影视| 亚洲精品偷拍| 欧美激情一区二区三区高清视频| 欧美大片国产精品| 亚洲国产成人av在线| 久热国产精品| 亚洲三级影院| 一区二区高清在线| 欧美激情第一页xxx| 一区二区亚洲| 欧美xx视频| 亚洲精品乱码久久久久久按摩观| 亚洲人成高清| 欧美精品二区| 一区二区三区日韩精品| 欧美亚洲一级片| 国产在线观看一区| 久久手机精品视频| 欧美风情在线观看| 日韩一级片网址| 国产精品乱码一区二三区小蝌蚪| 亚洲综合色视频| 麻豆精品在线播放| 亚洲每日在线| 国产精品免费观看在线| 欧美亚洲一区在线| 亚洲国产精品一区| 亚洲伊人网站| 在线成人av网站| 欧美日韩亚洲综合在线| 午夜精品免费在线| 久久精品国产99国产精品澳门| 一区二区在线不卡| 欧美精品在线观看播放| 亚洲尤物在线视频观看| 欧美777四色影视在线| 中文久久精品| 亚洲承认在线| 国产精品日本一区二区| 麻豆精品网站| 亚洲综合色婷婷| 亚洲二区三区四区| 久久精品91久久香蕉加勒比| 亚洲全黄一级网站| 国产亚洲成av人在线观看导航 | 午夜欧美大片免费观看 | 久久久精品性| 99精品视频免费全部在线| 国模 一区 二区 三区| 欧美日韩国产一区二区三区| 久久精品国产清自在天天线| 日韩视频在线一区| 免费观看国产成人| 欧美一区二区三区视频在线观看| 亚洲日本免费电影| 国外成人免费视频| 国产欧美精品在线播放| 欧美日韩不卡一区| 欧美成人精品1314www| 久久免费国产精品1| 亚洲欧美成人网|