簡體   English   中英

std :: string未使用=運算符更新

[英]std::string not updated with = operator

因此,這里有些C ++開發人員感到困惑。

我有一個正在使用的自定義String類,它應該教我如何熟悉類和其他一些C ++功能,並且該類具有用於跟蹤其原始值的value屬性(這是一個std::string )。

但這是一個問題,我定義了多種方法來創建此類的對象。 我完全理解其中的兩個:

String stringA = "Hello, World!";
String stringB = String("Hello, World!");

但是最后一個有點棘手,因為它應該能夠使用無限個參數集(理論上)。

String stringC = String("Hello,", ' ', "World!");

但是,當我訪問這些字符串的原始值時,最后一個似乎出錯了,並(盡我最大的調試努力)返回了任何內容,亂碼的文本或只是給定參數的一部分。

stringA.valueOf(); // -> Hello, World!
stringB.valueOf(); // -> Hello, World!
stringC.valueOf(); // -> Hello,

現在,這一直是我一直在努力克服的挑戰,尤其是當JavaScript開發人員涉足C ++時。 我知道這兩種語言在根本上是不同的,但我認為從邏輯上講,前者應該有一些功能可以在某種程度上應用於后者(例如可變參數)。

對於任何可以幫助您並向我解釋我所缺少的內容(或為什么我的代碼很爛的人)的人來說,您都是絕對的冠軍。 很高興為您服務。

#include <iostream>

/* Let's assume there's a `stringify` function that converts any value to `std::string` */
class String {
    private:
        std::string value;

    public:
        template <typename data>
        String(data arg) { this -> value += arg; }

        template <typename data, typename... argumentsData>
        String(data arg, argumentsData... args) {
            this -> value += arg;
            String(args...);
        }

        template <typename data>
        String operator =(data arg) { return String(this -> value = arg); }

        std::string valueOf() const { return this -> value; }
};

int main() {
    String stringA = "Hello, World!";
    String stringB = String("Hello, World!");
    String stringC = String("Hello,", ' ', "World!");

    std::cout << "String A: " << stringA.valueOf() << std::endl;
    std::cout << "String B: " << stringB.valueOf() << std::endl;
    std::cout << "String C: " << stringC.valueOf() << std::endl;

    return 0;
}

在您的構造函數中

template <typename data, typename... argumentsData>
String(data arg, argumentsData... args) {
    this -> value += arg;
    String(args...);
}

這行: String(args...); 創建並丟棄一個臨時 String ,它不會影響原始對象的狀態。

建議不要使用折疊表達式來嘗試通過遞歸來解決此問題:

template <typename ...P>
String(const P &... params) // Passing by const reference is purely an optimization.
{
    ((value += params) , ...);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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