[英]User-Defined Literal for Two-Argument Constructor
請考慮以下代碼:
#include <iostream>
class Point
{
public:
int x,y;
Point(int newx, int newy) : x(newx), y(newy) {}
};
Point operator"" x(const unsigned long long i)
{
return Point(i, 0);
}
int main()
{
Point p = 5x;
std::cout << "\npoint is " << p.x << "," << p.y << "\n\n";
return 0;
}
UDL有效,但它是否可以使它適用於Point的構造函數的兩個參數? 例如, 3x5
是Point(3,5)
的文字,甚至可能是3.5x
,然后在運算符體中進行一些數學運算,將整個部分與浮點數的小數部分分開..?
首先,請注意您為UDL提供的名稱必須以下划線開頭。
是的,這是可能的,但是你是否真的想問可能會有疑問。
Point operator"" _x(long double x) {
return Point(floor(x), (x-floor(x))*10);
}
int main(){
auto p = 3.5_x;
}
至於為什么你不想要。 現在,這將固定乘以10,將浮點數的小數部分轉換為整數。 如果你輸入像1.23
這樣的東西,你可能期望y
為23
,但這將給出2.3
。
更糟糕的是,您在源代碼中給出的數字很容易變成二進制的重復數字,因此幾乎沒有辦法從浮點數的小數部分開始,並確保您正在生成最初的預期。
使用浮點數這種方式似乎也缺乏一種合理的方式來表示像(3, -5)
這樣的點。 輸入僅允許一個符號表示整個數字。
您可以將其定義為采用字符串,然后在運行時解析字符串以生成正確的值。
auto p = "3x5"_x;
大多數人並不喜歡這個選項。 不得不在輸入引號中包含一些廢墟。 如果你想要這樣做,代碼看起來像這樣:
Point operator"" _x(char const * const s, unsigned long long len) {
int x, y;
sscanf(s, "%dx%d", &x, &y);
return Point(x, y);
}
當然,您可能更喜歡使用sscanf
以外的其他方式進行解析。 我只是快速地將它們拼湊在一起以顯示語法,而不是作為字符串解析的教程。
也許通過重載一些任意運算符:
class Point
{
public:
int x,y;
Point(int newx, int newy) : x(newx), y(newy) {}
};
Point operator&(Point p1, Point p2)
{
return Point(p1.x, p2.y);
}
Point operator"" _x(const unsigned long long i)
{
return Point(i, 0);
}
Point operator"" _y(const unsigned long long i)
{
return Point(0, i);
}
用法:
Point p = 5_x & 42_y;
但是說真的,我認為這樣做沒有意義,至少打字更多。 好老Point(x,y);
?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.