是否可以使用 C++03 在一行中构造容器并将数据填充到其中?
Is it is possible to construct container and filled data into it in one line using 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;
};
我想使用 C++03 像这样在一行中构建容器并向其中填充数据
// very easy to implement using C++11 std::initializer_list
Container<int> container{100,200,300}
或
Container<int> container(100,200,300)
或
// other one line solution
执行此操作后,data[0]=100,data[1]=200,data[2]=300
。
感谢您的宝贵时间。
附录
类似的问题是
Evg 已经给出答案可以实现两行解决方案。
Container<int> container(3);
container << 100, 200, 300;
我仍然想知道是否存在一线解决方案?
你的答案link差不多就可以了。您只需要稍作修改,那就是:您需要使您的容器可调整大小。这实际上是主要问题。一旦有了它,调整解决方案就很容易了。编写一个 insert
方法来重新分配内存并调整大小,然后只需要对建议的解决方案进行微小的修改。
有一个注意事项,即您不能在构造对象上调用构造函数调用方法,并且在没有副本的情况下将其分配给同一行中的变量。为此,可以提供从 Proxy
到 Container
的转换。我会重新考虑将某些东西放在一条线上是否真的值得这个成本,而在两条线上可以更容易地完成。
我没有包括 insert
的实现,因为那将是一个不同的问题:
#include <iostream>
template<typename Type>
class Container {
private:
struct Proxy {
Container* container;
Proxy(Container* container) : container(container) {}
Proxy& operator,(Type value) {
container->insert(value);
return *this;
}
operator Container() { return *container; }
};
public:
// ...
void insert(const Type& value) {
std::cout << value;
}
Proxy operator<<(Type value) {
insert(value);
return Proxy(this);
}
};
int main() {
Container<int> container = (Container<int>() << 1,2,3);
}
输出:
123
PS:
The problem is that, there is Container x={1,2,3,....,1000} everywhere in my project using C++11. Now, I must omove to C++03, and there is no std::itializer_list
是的,这是个问题。我想 1,2,3,...1000
只是一个过于简单的例子,否则你可以使用类似于 std::iota
的东西来填充容器(也只在 C++11 之后可用,但实现起来并不难)。如果那是实际问题,并且您正在寻找临时 hack,我宁愿使用普通数组并从中构建容器:
int temp[] = {1,2,3,4,5 ....};
Container<int> x( &temp[0], &temp[999]);
假设我有一个Container
。
template<typename Type>
class Container
{
public:
Container(int size_)
{
size=size_;
data = new Type[size];
}
~Container()
{
delete [] data;
}
private:
int size;
Type* data;
};
我想使用 C++03 像这样在一行中构建容器并向其中填充数据
// very easy to implement using C++11 std::initializer_list
Container<int> container{100,200,300}
或
Container<int> container(100,200,300)
或
// other one line solution
执行此操作后,data[0]=100,data[1]=200,data[2]=300
。
感谢您的宝贵时间。
附录
类似的问题是
Evg 已经给出答案可以实现两行解决方案。
Container<int> container(3);
container << 100, 200, 300;
我仍然想知道是否存在一线解决方案?
你的答案link差不多就可以了。您只需要稍作修改,那就是:您需要使您的容器可调整大小。这实际上是主要问题。一旦有了它,调整解决方案就很容易了。编写一个 insert
方法来重新分配内存并调整大小,然后只需要对建议的解决方案进行微小的修改。
有一个注意事项,即您不能在构造对象上调用构造函数调用方法,并且在没有副本的情况下将其分配给同一行中的变量。为此,可以提供从 Proxy
到 Container
的转换。我会重新考虑将某些东西放在一条线上是否真的值得这个成本,而在两条线上可以更容易地完成。
我没有包括 insert
的实现,因为那将是一个不同的问题:
#include <iostream>
template<typename Type>
class Container {
private:
struct Proxy {
Container* container;
Proxy(Container* container) : container(container) {}
Proxy& operator,(Type value) {
container->insert(value);
return *this;
}
operator Container() { return *container; }
};
public:
// ...
void insert(const Type& value) {
std::cout << value;
}
Proxy operator<<(Type value) {
insert(value);
return Proxy(this);
}
};
int main() {
Container<int> container = (Container<int>() << 1,2,3);
}
输出:
123
PS:
The problem is that, there is Container x={1,2,3,....,1000} everywhere in my project using C++11. Now, I must omove to C++03, and there is no std::itializer_list
是的,这是个问题。我想 1,2,3,...1000
只是一个过于简单的例子,否则你可以使用类似于 std::iota
的东西来填充容器(也只在 C++11 之后可用,但实现起来并不难)。如果那是实际问题,并且您正在寻找临时 hack,我宁愿使用普通数组并从中构建容器:
int temp[] = {1,2,3,4,5 ....};
Container<int> x( &temp[0], &temp[999]);