C++03中如何在没有临时变量的情况下立即将数据填充到容器中

How to fill data into container at once without temp variable in C++03

假设我有一个 Container.

template<typename Type>
class Container
{
public:
    Container(int size_)
    {
        size=size_;
        data = new Type[size];
    }
    ~Container()
    {
        delete [] data;
    }

private:
    int size;
    Type* data;
};

我想要像这样一次性将数据填充到容器中的东西

Container<int> container(3);
container << 100,200,300;

Container<int> container(3);
container.fill({100,200,300});

Container<int> container{100,200,300};

执行此操作后,data[0]=100data[1]=200data[2]=300

我不想引入一些临时变量

// I do not like this...
int data[]={1,2,3};
Container<int> container(3);
container.fill(data,data+3);

如何在 C++03 中实现它?

感谢您的宝贵时间。

附录 A:

类似的东西是 Eigen 的逗号初始化器

RowVectorXd vec1(3);
vec1 << 1, 2, 3;

附录 B:

我知道使用 C++11 std::initializer_list 很容易实现

Container<int> container{100,200,300};

使用简单的代理对象并重载 operator<<operator,。简单示例:

template<typename Type>
class Container {
private:
    struct Proxy {
        Type* data;
        Proxy(Type* data) : data(data) {}

        Proxy operator,(Type value) {
            *data = value;
            return Proxy(data + 1);
        }
    };

public:
    // ...

    Proxy operator<<(Type value) {        
        *data = value;
        return Proxy(data + 1);
    }
};

那么container << 100, 200, 300;会被翻译成

container.data[0] = 100;
container.data[1] = 200;
container.data[2] = 300;

Demo

如果您的容器遵循 STL 容器的实践和接口,那么它将有一个可以添加的 pushpush_back 成员,而无需创建临时列表:

Container<int> container(size);
container.push_back(1); container.push_back(2); container.push_back(3); // etc

当然不舒服,但是 "entry point" 您可能希望从中构建自定义解决方案。您甚至可以通用地实现@Evg 提供的代理,这意味着它可以与多种容器类型一起使用。

有关通用实现如何工作的示例,请查看 cxxomfort's _seq()

您不想引入临时数组有什么特别的原因吗?如果您使用的是 1990 年以后的任何体面的编译器并且将该数组声明为 const,编译器应该取消它并生成可能比任何自定义代理更好的目标代码,特别是如果编译器必须工作有参考资料。