在 C++98 中初始化结构数组的优雅方式
Elegant way to initialize array of structs in C++98
我正在使用 gcc 版本 4.9.2
如果我使用编译器标志 -std=c++0x 进行编译,则以下代码编译正常。
#include <iostream>
#include <vector>
using namespace std;
typedef struct
{
vector<int> a;
int b;
} MYTYPE;
int main(void)
{
MYTYPE test[]=
{
{ {1,2,3},4},
{ {5,6},7},
{ {},8}
};
}
如果我删除 -std=c++0x 标志,编译器会报告:
error: could not convert ‘{1, 2, 3}’ from ‘’ to ‘std::vector’
初始化 test[] 的优雅方法是什么?
除了通过在 struct
中编写一组丑陋的构造函数来在调用站点实现一些优雅的外观之外,没有特别优雅的方法来初始化这些 struct
的数组-C++11.
C++11 语法正是为这些构造而开发的。
对于 C++98,最好的可能是辅助函数的定义和使用:
struct Data
{
std::vector<int> vector;
int scalar;
};
template<std::size_t N>
Data make_data(const int (&vector)[N], int scalar)
{
Data result;
result.vector.assign(vector, vector+N);
result.scalar = scalar;
return result;
}
int main()
{
const int vector[] = {1,2,3}; // just to annoy people using namespace std :)
Data d = make_data(vector, 4);
std::cout << d.vector[2] << "\n" << d.scalar << "\n";
}
我正在使用 gcc 版本 4.9.2 如果我使用编译器标志 -std=c++0x 进行编译,则以下代码编译正常。
#include <iostream>
#include <vector>
using namespace std;
typedef struct
{
vector<int> a;
int b;
} MYTYPE;
int main(void)
{
MYTYPE test[]=
{
{ {1,2,3},4},
{ {5,6},7},
{ {},8}
};
}
如果我删除 -std=c++0x 标志,编译器会报告:
error: could not convert ‘{1, 2, 3}’ from ‘’ to ‘std::vector’
初始化 test[] 的优雅方法是什么?
除了通过在 struct
中编写一组丑陋的构造函数来在调用站点实现一些优雅的外观之外,没有特别优雅的方法来初始化这些 struct
的数组-C++11.
C++11 语法正是为这些构造而开发的。
对于 C++98,最好的可能是辅助函数的定义和使用:
struct Data
{
std::vector<int> vector;
int scalar;
};
template<std::size_t N>
Data make_data(const int (&vector)[N], int scalar)
{
Data result;
result.vector.assign(vector, vector+N);
result.scalar = scalar;
return result;
}
int main()
{
const int vector[] = {1,2,3}; // just to annoy people using namespace std :)
Data d = make_data(vector, 4);
std::cout << d.vector[2] << "\n" << d.scalar << "\n";
}