相关疑难解决方法(0)

如何使用std :: array模拟C数组初始化"int arr [] = {e1,e2,e3,...}"的行为?

(注意:这个问题是不必指定元素的数量,仍然允许直接初始化嵌套类型.)
这个问题讨论了C数组的用途int arr[20];.在他的回答中,@ James Kanze展示了C阵列的最后一个据点,它具有独特的初始化特性:

int arr[] = { 1, 3, 3, 7, 0, 4, 2, 0, 3, 1, 4, 1, 5, 9 };
Run Code Online (Sandbox Code Playgroud)

我们没有必要指定元素的数量,万岁!现在遍历它与C++ 11的功能std::beginstd::end<iterator>(或您自己的变体),你永远需要甚至认为它的大小.

现在,有没有(可能是TMP)方法实现同样的目标std::array?使用宏可以使它看起来更好.:)

??? std_array = { "here", "be", "elements" };
Run Code Online (Sandbox Code Playgroud)

编辑:中间版本,从各种答案编译,如下所示:

#include <array>
#include <utility>

template<class T, class... Tail, class Elem = typename std::decay<T>::type>
std::array<Elem,1+sizeof...(Tail)> make_array(T&& head, Tail&&... values)
{
  return { std::forward<T>(head), std::forward<Tail>(values)... };
}

// in code …
Run Code Online (Sandbox Code Playgroud)

c++ arrays templates initialization c++11

133
推荐指数
8
解决办法
1万
查看次数

是否可以使用模板元编程创建和初始化值数组?

我希望能够在编译时使用模板元编程创建一个计算值数组(为了简单起见,我希望每个值都是它的索引的平方).这可能吗?如何初始化数组中的每个位置?

(是的,有更简单的方法可以在不使用模板元编程的情况下执行此操作,只是想知道是否可以使用数组执行此操作.)

c++ metaprogramming

23
推荐指数
4
解决办法
1万
查看次数

在联盟中命名数组元素或结构和数组

考虑以下结构:

struct Vector4D
{
   union
   {
      double components[4];
      struct { double x, y, z, t; } Endpoint;
   };
};
Run Code Online (Sandbox Code Playgroud)

在我看来,我在WinApi的IPAddress结构中看到了类似的东西.我的想法是让我可以通过索引和名称来使用数组组件,例如:

Vector4D v;
v.components[2] = 3.0;
ASSERT(v.Endpoint.z == 3.0) //let's ignore precision issues for now
Run Code Online (Sandbox Code Playgroud)

在C++标准中,保证在POD结构的开头不会有"空"空间,也就是说,元素x将位于Endpoint结构的beginnig中.目前很好.但我似乎还没有找到任何保证将没有空的空间或填充,如果你愿意,之间xy,或yz,等等.我还没有检查出C99标准虽然.

问题是如果Endpoint结构元素之间有空格,那么这个想法就行不通了.

问题:

  1. 我是对的,确实无法保证这在C或C++中都能正常工作.

  2. 这实际上适用于任何已知的实现吗?换句话说,你知道任何不起作用的实现吗?

  3. 是否有任何标准(我的意思是不是编译器特定的)表达相同想法的方式?也许C++ 0x对齐功能可能会有所帮助?

顺便说一下,这不是我在生产代码中所做的事情,不用担心,只是好奇.提前致谢.

c c++ memory-alignment unions c++11

10
推荐指数
1
解决办法
3052
查看次数

"追溯联盟" - 可以做到吗?

我有两个类:一个模板类,一个继承它的常规类:

template <int N> class Vector
{
    float data[N];
    //etc. (math, mostly)
};

class Vector3 : public Vector<3>
{
    //Vector3-specific stuff, like the cross product
};
Run Code Online (Sandbox Code Playgroud)

现在,我想在子类中使用x/y/z成员变量(完整成员,而不仅仅是getter - 我希望能够设置它们).但是,为了确保所有的(继承)数学的作品出来,x就必须引用相同的内存data[0],ydata[1]等从本质上讲,我希望有一个工会,但我不能在基类中声明了一个,因为我不t知道该点向量中的浮点数.

那么 - 这可以吗?是否有某种预处理器/ typedef /模板魔法可以实现我正在寻找的东西?

PS:我正在使用带有-std = c ++ 0x的g ++ 4.6.0,如果有帮助的话.

编辑:虽然引用会给出我正在寻找的语法,但理想的解决方案不会使类更大(并且引用做了很多!A Vector<3>是12个字节.Vector3带参考的A 是40!).

c++ templates unions

3
推荐指数
2
解决办法
305
查看次数