Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;_C++_Arrays_C++11_Reinterpret Cast_Typecast Operator - Fatal编程技术网

C++ C++;

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;} 向量_类型

我几乎可以肯定这是做不到的,但我还是会问。 我必须使用一个基于C的库,它将数字向量定义为浮点数组,并使用许多算术函数。 我想创建一个简单的类,通过添加有用的操作符,可以轻松地将其转换为该类型。让我们看一个MWE:

#包括
使用向量_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[]
as
vector\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;
}