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

Lap*_*pys 2 c++

所以这里有一些C++开发人员的难题.

我有一个String我正在使用的自定义类,它应该教会我如何熟悉类和其他一些C++特性,这个类有一个value属性,用于跟踪它的原始值(即a std::string).

但是这里有一个问题,我已经定义了多种方法来创建这个类的对象.其中2个我完全理解:

String stringA = "Hello, World!";
String stringB = String("Hello, World!");
Run Code Online (Sandbox Code Playgroud)

但是最后一个有点棘手,因为它应该能够使用无限的一组参数(理论上).

String stringC = String("Hello,", ' ', "World!");
Run Code Online (Sandbox Code Playgroud)

但是当我访问这些字符串的原始值时,最后一个似乎会出错并返回(尽我最大的调试工作)没有任何内容,乱码文本或只是给出的部分参数.

stringA.valueOf(); // -> Hello, World!
stringB.valueOf(); // -> Hello, World!
stringC.valueOf(); // -> Hello,
Run Code Online (Sandbox Code Playgroud)

现在,这是一个我一直在努力的挑战,特别是作为一名潜入C++的JavaScript开发人员.我知道这两种语言根本不同,但我认为逻辑上应该有前者的一些特征可以在某种程度上适用于后者(例如可变参数).

对于任何可以帮助解决这个问题的人,并向我解释我缺少的东西(或者为什么我的代码很糟糕),你就是绝对的冠军.太棒了.

#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;
}
Run Code Online (Sandbox Code Playgroud)

Hol*_*Cat 5

在你的构造函数中

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

这一行:String(args...); 创建并丢弃一个临时的 String,不影响原始对象的状态.

我建议使用折叠表达式,而不是试图通过递归来解决这个问题:

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