![](/img/trans.png)
[英]No operator “>>” for std::string>>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.