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]=100
、data[1]=200
、data[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;
如果您的容器遵循 STL 容器的实践和接口,那么它将有一个可以添加的 push
或 push_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
,编译器应该取消它并生成可能比任何自定义代理更好的目标代码,特别是如果编译器必须工作有参考资料。
假设我有一个 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]=100
、data[1]=200
、data[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;
如果您的容器遵循 STL 容器的实践和接口,那么它将有一个可以添加的 push
或 push_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
,编译器应该取消它并生成可能比任何自定义代理更好的目标代码,特别是如果编译器必须工作有参考资料。