使用C C 給靜態型別資料新增運算子過載功能

2021-06-20 01:36:50 字數 3223 閱讀 4948

lu程式設計

使用c/c++給靜態型別資料新增運算子過載功能

1 說明

lu32.h,相信你會找到並正確使用這幾個檔案。

用c/c++編譯器建立乙個控制台應用程式,複製本文的例子**直接編譯執行即可。

2 關於運算子過載

在本教程系列的開始,介紹了lu指令碼的基本資料結構(詳細參考

lu程式設計指南

),即:

struct ludata;
基本資料型別

btype

決定了實際的資料結構,而擴充套件資料型別vtype決定了過載函式。若要對某資料型別vtype進行運算子過載,需要用函式

lockkey

對vtype加鎖,該函式定義如下:

int _stdcall lockkey(lukey

vtype

,void (_stdcall *deletekey)(void *),luoperator oplock);

vtype:被鎖定的鍵的型別。vtype

>

lupubkey_user(公有鍵、普通鍵)或者

vtype

。deletekey

:刪除鍵值的函式指標,用於標識要加鎖的鍵。該函式由使用者定義,但由lu呼叫。若

deletekey=

null,表示解鎖指定的鍵。

oplock

:luoperator

型別的函式指標,用於物件(用指標標識)的運算子過載,該引數不可為null。解鎖和加鎖所用的

oplock

函式必須相同。參考[注1]

如果加鎖或解鎖成功,該函式返回0,否則返回非0值。

[注1]:運算子過載函式

luoperator

函式格式如下(與lu二級函式相比,僅多了乙個引數

theoperator

):

//m指出陣列para的引數個數(也即運算元的個數,0表示1個,1表示2個,以此類推)。

//hfor為呼叫該函式的表示式控制代碼(與二級函式中的表示式控制代碼相同)。

//theoperator指出運算子的型別或操作型別:+、-、*、/、^、... ...。

ludata (_stdcall *luoperator)(luint m,ludata *para,void *hfor,int theoperator);

ludata _stdcall oplock(luint m,ludata *para,void *hfor,int theoperator)

}

如果不打算給加鎖的鍵提供運算子或函式過載功能,須使用函式

setrunerr

向lu報告執行錯誤。

本文討論使用c/c++給靜態型別資料新增運算子過載功能。本文的例子是實現c/c++中的單位元組字元型別 char(基本型別為 lustadata_int64,擴充套件型別為 key_char),但僅定義了部分運算。

3**

#include #include "lu32.h"

#pragma comment( lib, "lu32.lib" )

lukey key_char = lupoikey_user-20; //標識char的私有鍵,將對其加鎖

void _stdcall del_char(void *me) //銷毀char的函式,但什麼也不做,只為了配合運算子過載,加鎖鍵使用

ludata _stdcall oplock_char(luint m,ludata *para,void *hfor,int theoperator) //char的運算子過載函式

return a;

err:

a.btype=lustadata_nil; a.vtype=lustadata_nil; a.x=0; //引數不符合要求,返回nil

setrunerr(1,l"char 引數無法識別!",theoperator,0,hfor);

return a;

}//lu指令碼可呼叫的二級函式定義

ludata _stdcall lu_int2char(luint mm,ludata *xx,void *vfor) //將乙個整數轉換為char

else //出錯時向lu系統報告執行錯誤

return a;

}void main(void)

else

printf("c 表示式的值: %d \n",((char)800) % ((char)500));

lockkey(key_char,null,oplock_char); //在lu鍵樹中解鎖鍵

freelu(); //釋放lu

}

執行結果:

lu表示式的值: 8

c 表示式的值: 8

4函式說明

本例用到了lu的6個輸出函式:初始化

lu的函式

initlu

,釋放lu

的函式freelu,編譯表示式的函式lucom、計算表示式的函式lucal

、加鎖鍵函式

lockkey

、註冊c/c++函式的函式setfunction。從這裡檢視這些函式的說明:

lu程式設計指南。

5難點分析

在給靜態型別資料新增運算子過載功能時,需要:(1)用

lockkey

加鎖乙個鍵(本例為key_char),但不需要向lu系統註冊任何鍵值;(2)刪除鍵值的函式(本例為del_char)定義為空函式;(3)定義運算子過載函式(本例為oplock_char)。

根據函式oplock_char中定義的運算規則可知,**中的字串表示式定義為 "int2char(800) % 500" 或者 "800 % int2char(500)" 有相同的運算結果,很明顯,本例較簡單,沒有實現不同資料型別的自動轉換。

6 其他

你可能注意到了,我的****就在下面,如有不明之處或有什麼建議,可隨時與我進行聯絡。

最近更新:

2023年01月05日

給category新增基本資料型別屬性

給category新增基本資料型別屬性 通常,我們新增屬性都是通過物件擴充套件來實現的,其實,我們也可以用runtime來新增基本資料型別的屬性原始碼 uiview animationproperty.h runtimecategory created by youxianming on 15 7 ...

使用Excel批量給資料新增單引號和逗號

在使用plsql連線oracle資料庫處理資料的過程中,常用的操作是通過id查詢出資料,id需要附上單引號,如果查詢的id為一條或者幾條,我們手動新增即可,但是如果是幾百條 幾千條的話,就需要使用一些方法來進行批量處理。這裡就介紹使用excel 進行批量新增的方法。製作過程如下 a2 暫時為空,模板...

使用Excel批量給資料新增單引號和逗號

製作過程如下 a2 暫時為空,模板建立完成以後,用來放置原始資料 在b2 內輸入公式 a2 敲擊回車 解釋 b2 的公式 a2 中,表示資料左上角的單引號,在excel 中需要用雙引號將特殊字元引上 字元為連線字元,用來連線字串或者數值 a2是原始資料存放 表示在資料的右上角新增單引號 表示在資料後...