用Perl來協助產生C++版“自動屬性”

來源:互聯網
上載者:User

用VS來使用C#的應該知道有個自動屬性,類似於

public int MyProperty { get; set; }

他幫你自動產生get/set方法,還幫你把這些方法綁定到該屬性上,很方便的說,但是C++的IDE裡沒有這個功能的,而且我們C++需要寫

     _declspec(property(put=setJobID, get=getJobID))        unsigned long jobID;    void            setJobID(unsigned long inJobID);    unsigned long   getJobID() const;

這麼多代碼來做這些事情,故我用perl寫了個簡單的指令碼,根據變數類型、變數名字和變數讀寫屬性幫我自動產生這些。

前提:1.電腦上有安裝perl,且能正常使用。2.提供一個field.txt,裡面的每行都包含 變數類型,變數名字,變數讀寫屬性例如string,version,rw       unsigned long,length,r       YourStructName,structName,w簡單知識點:1.檔案讀寫 perl檔案讀需要用到IO::File 或者輸入重新導向,這裡用的模組是IO::File.
my $f = new IO::File("< field.txt");# the file contains type,name,rw/r/wif(!$f){   print("$!\n");   exit(1);}

 輸出這塊用的是輸出重新導向,可以參考

# 建立STDOUT控制代碼的一個副本,之後可以關閉STDOUTopen my $oldout, '>&', \*STDOUT or die "Cannot dup STDOUT: $!";# 重新將STDOUT開啟為檔案output.txt的控制代碼# 在開啟檔案之前,Perl會將原來儲存在STDOUT中的控制代碼關閉open STDOUT, '>', 'output.txt' or die "Cannot reopen STDOUT: $!";# 接下來的預設輸出將會寫入到output.txtprint "Hello, World!\n";# 從原有的STDOUT副本中恢複預設的STDOUTopen STDOUT, '>&', $oldout or die "Cannot dup \$oldout: $!";

2.字串包含  用Regex就可以$a=~/w/ 表示$a包含“w”。廢話不多說,上全部代碼:

#!/usr/bin/perluse strict;use warnings;use IO::File;my $f = new IO::File("< field.txt");# the file contains type,name,rw/r/wif(!$f){   print("$!\n");   exit(1);}#stdout -> fileopen my $oldout, '>&', \*STDOUT or die "Cannot dup STDOUT: $!";open STDOUT, '>', 'output.txt' or die "Cannot reopen STDOUT: $!";my $line;my @array;while($line=<$f>){   chomp($line);   $array[@array]=[split(/,/,$line,3)];}my $i;#for $i ( 0 .. $#array ) #{            #print $array[$i][0]." ".$array[$i][1]." ".$array[$i][2]."\n";#}#    _declspec(property(put=setName,get=getname))               #       type name;for $i (0..$#array){ my $result = "_declspec(property(";my $type = $array[$i][0];my $name = $array[$i][1];my $rw   = $array[$i][2];if ($rw =~ /w/){$result = $result."put=set".$name.",";}if($rw =~ /r/){$result = $result."get=get".$name."))";}$result = $result."\n    ".$type."  ".$name.";\n";print $result;}#  void            setProgress(unsigned long inPercentDone);#unsigned char   getProgress() const;for $i (0..$#array){ my $type = $array[$i][0];my $name = $array[$i][1];my $rw   = $array[$i][2];my $result ="";if ($rw =~ /w/){#w$result = $result."void    set".$name."(".$type." in".$name.");\n";}if($rw =~ /r/){#r$result = $result.$type."    get".$name."() const;\n";}print $result;}#file -> stdoutopen STDOUT, '>&', $oldout or die "Cannot dup \$oldout: $!";my $status = system( "notepad.exe output.txt" );if ($status != 0){print "Failed to open output.txt";exit -1;} else {print "Success to open output.txt,please check it !";}exit 0;
輸出的檔案是output.txt,裡面上半部分是綁定,下半部分是 get/set函式宣告。全部代碼見於:https://github.com/lcl-data/GeneratedAutoPropertyInCplusplus
LCL_data原創於CSDN blog,轉載請註明。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.