C++ C++;
我几乎可以肯定这是做不到的,但我还是会问。 我必须使用一个基于C的库,它将数字向量定义为浮点数组,并使用许多算术函数。 我想创建一个简单的类,通过添加有用的操作符,可以轻松地将其转换为该类型。让我们看一个MWE:C++ C++;,c++,arrays,c++11,reinterpret-cast,typecast-operator,C++,Arrays,C++11,Reinterpret Cast,Typecast Operator,我几乎可以肯定这是做不到的,但我还是会问。 我必须使用一个基于C的库,它将数字向量定义为浮点数组,并使用许多算术函数。 我想创建一个简单的类,通过添加有用的操作符,可以轻松地将其转换为该类型。让我们看一个MWE: #包括 使用向量_type=float[3]; 类新类型 { 公众: 浮点运算符[](std::size_t i){return v[i];} 常量浮点和运算符[](std::size_t i)常量{return v[i];} 运算符向量_type&({return v;} 向量_类型
#包括
使用向量_type=float[3];
类新类型
{
公众:
浮点运算符[](std::size_t i){return v[i];}
常量浮点和运算符[](std::size_t i)常量{return v[i];}
运算符向量_type&({return v;}
向量_类型*运算符&({return&v;}
私人:
v型向量u;
};
int main()
{
新t型;
t[0]=0.f;t[1]=1.f;t[2]=2.f;
常数向量_类型&v=t;
std::cout#包括
#包括
typedef std::矢量_类型;
类NewType:公共向量_类型
{
公众:
void MyMethod(){std::cout我认为这不是最好的解决方案,但它是我所能想到的使用C++14功能的最佳解决方案。也许,如果在未来的标准中引入运行时大小的成员分配(对C++14的建议已被拒绝),一个更好的解决方案将是可能的。但现在
#包括
#包括
#包括
使用向量_type=float[3];
类新类型
{
公众:
浮点运算符[](std::size_t i){return v[i];}
常量浮点和运算符[](std::size_t i)常量{return v[i];}
运算符向量_type&({return v;}
向量_类型*运算符&({return&v;}
私人:
v型向量u;
};
类NewTypeArray
{
公众:
NewTypeArray():大小(0),newType(nullptr){
NewTypeArray(std::size\u t size):size(size){assert(size>0);newType=newNewType[size];}
~NewTypeArray(){if(size>0)delete[]newType;}
NewType&运算符[](std::size_t i){返回NewType[i];}
运算符向量_type*(){return static_cast(&newType[0]);}
私人:
标准:大小;
新类型*新类型;
};
static_assert(sizeof(NewType)==sizeof(vector_type)和sizeof(NewType[7])==sizeof(vector_type[7]),
“NewType和vector_type具有不同的内存布局”);
显然,可以修改NewTypeArray
,实现面向向量的方法、移动构造函数和赋值(就像我的实际代码一样)。
NewTypeArray
的实例可以直接传递给以vector\U type*
为参数的函数,并且由于static\U assert
,内存管理应该不会出现任何类型的问题。编译器可以并且将利用超出填充的未定义行为的各种优势。UB是UB.我看不到您在NewType
中添加的“有用的操作”。在这种情况下,细节很重要。实际的NewType
是标准布局吗?如果不是,为什么不?…隐式转换为vector\u类型&
和vector\u类型*
似乎是个坏主意。@Yakk我写的,正如前面所解释的,是一个最小的工作示例.对于我的问题来说,实现与线性代数相关的所有可能函数是完全没有用的。许多库可能对我的目的有用(例如:eigen3,armadillo…),但我需要一个具体的案例,我必须编写我的实现。然而,它与这个问题没有严格的关系。另一个解决方案是包装C库。这不仅仅是因为重新解释\u cast
而导致的对齐问题。未定义的行为可能会导致UB,而这个cast违反了严格的别名rule.我知道它们显然是不兼容的类型。我需要处理原始数据,而不是副本(否则这些问题根本不存在;),因此您答案中的代码不是我所期望的。我想做的是引用NewType[]
asvector\u type[]
。我编辑这个类是为了允许一件简单的事情:现在可以写下NewType t1;vector\u type*t2=t1;
。当NewType在数组中时,我想允许同样的事情,而不使用重新解释
。但是,正如我最初所说的,AFAIK是不可能的,我只是想确定一下。AFAIK它不可能能够在两个基类型不同的数组之间交换引用。另一种可能的解决方案(尽管不推荐)是对向量类型使用std::vector。这样,您可以将其传递给C API,同时可以继承和添加功能(请参阅我编辑的答案)。希望这能有所帮助,但我仍然不确定这是否满足您的需要。不幸的是,您的想法无法应用,因为我无法更改另一个库中声明的向量_type
。我编辑了我的问题,添加了一个更清楚的我需要的示例。不过,谢谢您:当像您这样的人真的试图忍受你的问题,努力帮助你!
#include <iostream>
#include <vector>
typedef std::vector<float> vector_type;
class NewType: public vector_type
{
public:
void MyMethod() {std::cout << "extending the vector type!" << std::endl;}
};
int main()
{
NewType myNewTypeVector[10];
myNewTypeVector[0] = NewType();
myNewTypeVector[0].push_back(1);
myNewTypeVector[0].push_back(2);
vector_type* p = myNewTypeVector;
std::cout << "Content of my_vector index 0: " << p[0][0] << std::endl;
std::cout << "Content of my_vector index 1: " << p[0][1] << std::endl;
std::cout << "Content of myNewTypeVector index 1: " << myNewTypeVector[0][1] << std::endl;
return 0;
}