首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >模板类型定义数组初始化

模板类型定义数组初始化
EN

Stack Overflow用户
提问于 2013-10-30 23:40:40
回答 2查看 167关注 0票数 1

我有一个数组,我想要初始化为一个基于模板参数(我认为这将需要c++14,因为我设想的答案要求初始化列表为constexpr)。

假设我有一个模板

代码语言:javascript
复制
template<T t>

哪里

代码语言:javascript
复制
 T = int[1][2][3]

现在,我可以使用type_traits std::区段递归提取数组大小。

我最终想要做的是生成一个以T的维数作为myarray元素的警员成员

代码语言:javascript
复制
std::array<int,3> myarray = {1,2,3};

我看到了使用可变模板ref:How to construct std::array object with initializer list?初始化数组的好方法

问题是,如何生成具有给定T?1维数的初始化列表或可变模板。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-10-31 00:10:29

下面的内容有点复杂,但是它应该可以工作(对于C++11):

代码语言:javascript
复制
#include <array>
#include <type_traits>

template<std::size_t...> struct seq {};

template<typename,typename> struct cat;
template<std::size_t... Is, std::size_t... Js>
struct cat<seq<Is...>,seq<Js...>>
{
    using type = seq<Is...,Js...>;
};

template<typename> struct extract_seq { using type = seq<>; };
template<typename T,std::size_t N>
struct extract_seq<T[N]>
{
    using type = typename cat< seq<N>, typename extract_seq<T>::type >::type;
};

template<typename T> struct extract_type { using type = T; };
template<typename T,std::size_t N>
struct extract_type<T[N]>
  : extract_type<T>
{};

template<typename,typename> struct to_array_helper;
template<typename T, std::size_t... Is>
struct to_array_helper<T,seq<Is...>>
{
    constexpr static const std::array<T,sizeof...(Is)> value {{ Is... }};
};

template<typename T, std::size_t... Is>
constexpr const std::array<T,sizeof...(Is)>
to_array_helper<T,seq<Is...>>::value;

template<typename T>
struct to_array
  : to_array_helper<typename extract_type<T>::type,
                    typename extract_seq<T>::type>
{};

int main()
{
    auto arr = to_array< int[1][2][3] >::value;
}

Live example

票数 2
EN

Stack Overflow用户

发布于 2013-10-30 23:51:39

我不认为你需要任何特殊的未来C++。这在C++11中运行得很好:

代码语言:javascript
复制
#include <array>
#include <iostream>
#include <type_traits>

#include <prettyprint.hpp>

template <typename T>
struct Foo
{
    std::array<std::size_t, std::rank<T>::value> a;

    Foo() : Foo(X<std::rank<T>::value>(), Y<>(), Z<T>()) { }

private:
    template <unsigned int K>  struct X { };
    template <unsigned int ...I> struct Y { };
    template <typename> struct Z { };

    template <typename U, unsigned int K, unsigned int ...I>
    Foo(X<K>, Y<I...>, Z<U>)
    : Foo(X<K - 1>(),
          Y<I..., std::extent<U>::value>(),
          Z<typename std::remove_extent<U>::type>())
    { }

    template <typename U, unsigned int ...I>
    Foo(X<0>, Y<I...>, Z<U>) 
    : a { I... }
    { }
};

int main()
{
    Foo<char[4][9][1]> x;
    std::cout << x.a << std::endl;
}

产出:

代码语言:javascript
复制
[4, 9, 1]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19695885

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档