使用枚举类型管理存储顺序



我正在尝试使用枚举类型来索引某个数组,但我想根据某些选项允许向量的不同排序。在类中,我还想要将枚举变量作为输入并按预期使用它的函数。

我找到的解决方案如下

#include<iostream>
#include<array>
#include<vector>
struct A{
struct XYZ{
enum coord{X=0,Y,Z};
};
struct YZX{
enum coord{Y=0,Z,X};
};
struct ZXY{
enum coord{Z=0,X,Y};
};
std::array<std::vector<float>,3> val;
void resize(int opt, size_t dim){
val[opt].resize(dim);
return;
}
void printsize(){
for(auto & i : val){
std::cout << i.size() << " ";
}
std::cout << std::endl;
return;
}
};
int main(){
A foo1;
A foo2;
A foo3;
foo1.resize(XYZ::X,10);
foo2.resize(YZX::X,10);
foo3.resize(ZXY::X,10);
std::cout << "Size foo1n";
foo1.printsize();
std::cout << "Size foo2n";
foo2.printsize();
std::cout << "Size foo3n";
foo3.printsize();
return 0;
}

我不喜欢这个解决方案的是我的函数 resize 采用整数类型作为输入,并且枚举没有类型控制。

还有其他更智能的解决方案吗?我是否在做一些被认为是反模式的事情?

谢谢

我建议你修改成员函数resize(三个参数而不是两个(并利用enum classes的类型安全性:

#include <stdio.h>
#include<iostream>
#include<array>
#include<vector>
struct A{
enum class Coordinate
{
X = 0,
Y = 1,
Z = 2
};
enum class Permutation
{
XYZ = 0,
ZXY = 1,
YZX = 2
};
std::array<std::vector<float>,3> val;

/* resize takes three parameters now */
void resize(Permutation p, Coordinate c, size_t dim)
{
int  index = ( static_cast<int>(p) + static_cast<int>(c) ) % 3 ;
val[index].resize(dim);
return;
}
void printsize(){
for(auto & i : val){
std::cout << i.size() << " ";
}
std::cout << std::endl;
return;
}
};

int main()
{
A foo1;
A foo2;
A foo3;
foo1.resize(A::Permutation::XYZ, A::Coordinate::X,10); 
foo2.resize(A::Permutation::YZX, A::Coordinate::X,10); 
foo3.resize(A::Permutation::ZXY, A::Coordinate::X,10); 
std::cout << "Size foo1n";
foo1.printsize();
std::cout << "Size foo2n";
foo2.printsize();
std::cout << "Size foo3n";
foo3.printsize();
return 0;
}

一个Index类怎么样,可以从几个enum class构造?

struct A
{
enum class XYZ {X,Y,Z};
enum class YZX {Y,Z,X};
enum class ZXY {Z,X,Y};
struct Index
{
int value;
operator int() const {return value;}
Index(XYZ value) : value(int(value)) {}
Index(YZX value) : value(int(value)) {}
Index(ZXY value) : value(int(value)) {}
};
std::array<std::vector<float>, 3> val;
void resize(Index opt, size_t dim)
{
val[opt].resize(dim);
}
void printsize() const
{
for (const auto &i : val)
std::cout << i.size() << ' ';
std::cout << 'n';
}
};

最新更新