簡體   English   中英

用於雙參數構造函數的用戶定義文字

[英]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的構造函數的兩個參數? 例如, 3x5Point(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這樣的東西,你可能期望y23 ,但這將給出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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM