在C++ 0x Variadic Templates Proposal paper Link中,有一个类的例子,它支持任意数量的维度.我在下面复制了它:
template<typename T, unsigned PrimaryDimension, unsigned... Dimensions>
class array { /* implementation */ };
array<double, 3, 3> rotation matrix; // 3x3 rotation matrix
Run Code Online (Sandbox Code Playgroud)
遗憾的是没有提供实施.由于我对可变参数模板相对较新,我有兴趣看到这个容器的实现.
感谢任何能提供简单实施的人.
以下std::array <char, N>使用字符串文字在构造函数中初始化成员的示例不能在GCC 4.8上编译,而是使用Clang 3.4进行编译.
#include <iostream>
#include <array>
struct A {
std::array<char, 4> x;
A(std::array<char, 4> arr) : x(arr) {}
};
int main() {
// works with Clang 3.4, error in GCC 4.8.
// It should be the equivalent of "A a ({'b','u','g','\0'});"
A a ({"bug"});
for (std::size_t i = 0; i < a.x.size(); ++i)
std::cout << a.x[i] << '\n';
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在第一印象,它看起来像一个GCC错误.我觉得它应该编译,因为我们可以std::array<char, N>直接用字符串文字初始化.例如:
std::array<char, 4> test = {"bug"}; //works
Run Code Online (Sandbox Code Playgroud)
我很想知道标准对此有何看法.
唯一且非常不方便的警告std::array是,它不能从内置C数组的初始化列表中推断出它的大小,它的大小必须作为模板传递.
是否可以使用C++11initializer_list 实现类似std :: array的容器(内置C数组周围的薄包装器)?
我问,因为,与std :: array不同,它会自动从初始化列表中推断出数组的大小,这样更方便.例如:
// il_array is the hypothetical container
// automatically deduces its size from the initalizer list
il_array <int> myarr = {2, 4, 6, 7, 8};
Run Code Online (Sandbox Code Playgroud)
如果没有提供初始化列表,我们还希望提供一个构造函数来指定大小.例如:
// construct a fixed size array of size 10
il_array <int> myarr2 (10);
Run Code Online (Sandbox Code Playgroud)
这也将使容器与其他标准容器(例如vector,deque和list)更加一致.
据我所知,由于包裹的C数组(如T elems [size])必须具有恒定大小且initializer_list的size()成员函数不是常量,因此不可能.
另外,我想知道是否有可能使用可变参数模板来实现这样的容器,尽管从我读过的内容我不认为这是可能的.
现在"static_assert"是C++ 0x中的关键字我认为用"assert"关键字替换C"assert"宏也是合乎逻辑的.
除非我遗漏了某些内容,否则SGI slist和C++ 11 std::forward_list看起来都与我完全相同; 两者都实现了单链表.
我假设有一点不同,因为C++标准委员会没有采用名称slist而是选择了一个新名称forward_list,当他们将容器添加到C++ 0x的标准库中时.
在C++ 11中,可以使用constexpr创建一个函数,该函数在编译时返回内置一维数组的大小(元素数).示例如下:
template <typename T, std::size_t N>
constexpr std::size_t size(T (&array)[N])
{
return N;
}
Run Code Online (Sandbox Code Playgroud)
这是ARRAY_SIZE和类似宏imo的优秀替代品.
但是,这只会返回内置多维数组最重要维度的大小.
我使用以下函数来确定内置二维数组的大小:
template <typename T, std::size_t N, std::size_t N2>
constexpr std::size_t size(T (&array)[N][N2])
{
return N * N2;
}
Run Code Online (Sandbox Code Playgroud)
理想情况下,使用一个函数返回具有任意数量维度的内置数组的大小非常有用.我认为可变参数模板可能会有所帮助,但我无法看到解压缩模板参数的方法,因为只传递了一个参数.这样的功能可能吗?
提前致谢.
c++ built-in multidimensional-array variadic-templates c++11