c++在多维数组中设置默认值的更优雅的方法
C++ More Elegant Way to set Default Values in multi-dimensional array
在我的。h文件中,我有:
struct tup{
tup() :
token{{-1,"a","b","c","d","e","f"},
{-1,"a","b","c","d","e","f"},
...
{-1,"a","b","c","d","e","f"}} {}
struct {
int pos;
std::string nj, ny, pa, ri, ct, fl;
} token[100];
其中"…"指的是97行相同类型的代码。是否有一种更优雅的方法来为我的令牌设置默认值?
如果您愿意使用std::vector
而不是数组,您可以使用:
struct tup{
tup() : tokens(100, {-1,"a","b","c","d","e","f"}) {}
struct token {
int pos;
std::string nj, ny, pa, ri, ct, fl;
};
std::vector<token> tokens;
};
您应该在cpp文件中使用构造函数(并且使用类而不是结构)。数组的实际内容是一个不应该出现在头文件中的实现细节。最好的方法是在初始化类的方法中使用循环(100项对于计算机来说是一个很小的数字,您不会看到差异)。它还允许你更好地处理错误(构造函数不能轻易返回错误代码;您可以使用引用或成员,但这很难看)。这是我能想到的最好的办法。
在你的解析器中,所有的字符串只是字符吗?如果n是您的字符串的最大长度,您可以简单地使用char或char[n+1]。使用std::string,您可以对小尺寸进行静态分配(浪费一点空间),对大尺寸进行动态分配。如果必须处理分配错误,则需要一个用于初始化类的成员。因此,头文件只提供其他文件所需的最少信息(结构和大小,而不是数据)。
如果你希望以后能够阅读你的代码,我还建议你使用有意义的变量名(它们的大小不是问题)。
100的限制对我来说就像代码的味道。为什么不使用动态分配和无限制大小呢?您可以简单地在构建集合时将新的令牌值推入集合中。默认值应该只存在于令牌的构造函数中,而不是存在于具有虚拟大小的数组中。如果以后扩展解析器以处理更多令牌会怎样?如果您希望代码不断发展,那么硬编码数组的最大值是一种不好的做法。当您达到极限时,您通常会在注意到错误之前遇到错误。
下面是一个示范程序,演示了在编译器支持c++ 2014的情况下如何定义构造函数。否则,您必须将std::remove_extent_t
类型更改为c++ 2011中的等效类型。
#include <iostream>
#include <algorithm>
#include <iterator>
#include <type_traits>
#include <string>
struct tup{
tup()
{
std::fill( std::begin( token ), std::end( token ),
std::remove_extent_t<decltype( token )>( {-1,"a","b","c","d","e","f"} ) );
}
struct {
int pos;
std::string nj, ny, pa, ri, ct, fl;
} token[100];
};
int main()
{
tup tup;
std::cout << tup.token[0].pos << ' ' << tup.token[0].nj << std::endl;
std::cout << "//..." << std::endl;
std::cout << tup.token[99].pos << ' ' << tup.token[99].nj << std::endl;
}
程序输出为
-1 a
//...
-1 a
在任何情况下,您都可以使用标准算法std::fill
,如我所示或其他方式,例如使用lambda表达式。
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 具有默认值的引用获取函数
- 当给定默认值时,为什么此模板参数推导失败
- 从具有默认值的部分指定模板类继承时发生SWIG错误,具有不带默认值的正向声明
- 格式化浮点值:返回默认值
- 如何将数组部分初始化为某个默认值?
- asn1c 不会从 asn.1 模块中提取八位字节字符串的默认值
- 模板类专业化具有成员变量和方法的默认值
- 从指针访问值或获取其默认值(如果为 null)的最干净方法
- 存储具有许多变体的类的默认值的推荐方法是什么?
- 成员属性作为方法的默认值
- 如何创建一个 std::function 作为方法参数,并将 std::stoi 作为默认值
- 使用类属性值作为方法默认参数的替代方法
- GMock -使用ON_CALL返回重载方法的默认值
- 在编译时存储默认值的优雅而有效的方法
- 重载方法还是使用默认值?c++
- c++在多维数组中设置默认值的更优雅的方法
- 如何在方法中为向量设置默认值
- 是否可以使用构造函数或对象作为其他类方法的参数默认值?
- c++ setGender方法恢复为默认值