C++ 如何初始化从0..N-1索引的函数模板的N个函数指针数组?

C++ 如何初始化从0..N-1索引的函数模板的N个函数指针数组?,c++,arrays,c++11,initializer-list,static-initialization,C++,Arrays,C++11,Initializer List,Static Initialization,给定function_sig的函数指针数组,我想将其初始化为一组模板函数指针,这些指针通过模板参数进行索引。这可能吗 例如 模板 void fn(){/*做点什么*/} typedef void(*function_sig)(); 模板 结构项 { 静态函数_sig数组[数组_大小]; }; 模板 函数_sig items::array={/*我在这里放什么?*/}; 那么,有什么东西可以放在初始化器列表中,比如items::array将被初始化为{fn,fn,…,fn} 注意:我知道一种使用

给定
function_sig
的函数指针数组,我想将其初始化为一组模板函数指针,这些指针通过模板参数进行索引。这可能吗

例如

模板
void fn(){/*做点什么*/}
typedef void(*function_sig)();
模板
结构项
{
静态函数_sig数组[数组_大小];
};
模板
函数_sig items::array={/*我在这里放什么?*/};
那么,有什么东西可以放在初始化器列表中,比如
items::array
将被初始化为
{fn,fn,…,fn}

注意:我知道一种使用预处理器魔法的方法,但我想尝试一下,不使用它。目前,我想我必须去掉数组,用类似数组的东西替换它,但这会导致在索引伪数组时搜索O(N),我不想这样做。

\35; include

#include <array>

template<int... Is>
struct int_seq { };

namespace detail {

template<int I, int... Is>
struct make_int_seq : make_int_seq<I - 1, I, Is...> { };

template<int... Is>
struct make_int_seq<0, Is...> {
    using type = int_seq<0, Is...>;
};

} // namespace detail

template<int SizeN>
using make_int_seq = typename detail::make_int_seq<SizeN - 1>::type;

template<int I>
void fn() { /* do something */ }

//typedef void(*function_sig)();
using function_sig = void(*)();

template<int ARRAY_SIZE>
struct items {
    static std::array<function_sig, ARRAY_SIZE> array;
};

template<int... Is>
std::array<function_sig, sizeof...(Is)> create_items_array(int_seq<Is...>) {
    return {{ &fn<Is>... }};
}

template<int ARRAY_SIZE>
std::array<function_sig, ARRAY_SIZE> items<ARRAY_SIZE>::array
  = create_items_array(make_int_seq<ARRAY_SIZE>{});

在C++14中,
int_-seq
等消失,取而代之的是
std::integer_-sequence

问题是获得从0到
数组大小-1的可变范围

我提出了一种在基类
itemsH

#include <iostream>


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

template <std::size_t N, std::size_t ... Next>
struct rangeH 
 { using type = typename rangeH<N-1U, N-1U, Next ... >::type; };

template <std::size_t ... Next >
struct rangeH<0U, Next ... >
 { using type = range<Next ... >; };


template<int I>
void fn() { std::cout << "[" << I << "]" << std::endl; }

typedef void(*function_sig)();

template <typename T>
struct itemsH;

template <std::size_t ... RNG>
struct itemsH<range<RNG...>>
 {
   static function_sig array[sizeof...(RNG)];
 };

template<std::size_t ARRAY_SIZE>
struct items : public itemsH<typename rangeH<ARRAY_SIZE>::type>
 { };

template <std::size_t ... RNG>
function_sig itemsH<range<RNG...>>::array[sizeof...(RNG)] = { fn<RNG>... };


int main ()
 {
   items<10>  i_10;

   for ( unsigned ui = 0U ; ui < 10 ; ++ui )
      i_10.array[ui]();

   return 0;
 }

这些问答对你有帮助吗:或者?@MicroVirus,可能,尽管这是为c++11编译器(VS2013)准备的。我还是会通读一遍,看看能不能想出点什么。谢谢。@Adrian:不,C数组是不可复制的,因此无法从函数返回,我们需要
create\u items\u array
factory函数。仅供参考,升级到C++14时需要做一些细微的修改,因为您的
make\u int\u seq
将生成0..N,其中as
std::make_integer\u sequence
生成0..N-1。@Adrian:,我不知道你为什么会这样认为……你的英语很好,切换到
std::size\t
也很好。我只使用了
int
,因为我很懒D我通常使用
std::size\u t
#include <iostream>


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

template <std::size_t N, std::size_t ... Next>
struct rangeH 
 { using type = typename rangeH<N-1U, N-1U, Next ... >::type; };

template <std::size_t ... Next >
struct rangeH<0U, Next ... >
 { using type = range<Next ... >; };


template<int I>
void fn() { std::cout << "[" << I << "]" << std::endl; }

typedef void(*function_sig)();

template <typename T>
struct itemsH;

template <std::size_t ... RNG>
struct itemsH<range<RNG...>>
 {
   static function_sig array[sizeof...(RNG)];
 };

template<std::size_t ARRAY_SIZE>
struct items : public itemsH<typename rangeH<ARRAY_SIZE>::type>
 { };

template <std::size_t ... RNG>
function_sig itemsH<range<RNG...>>::array[sizeof...(RNG)] = { fn<RNG>... };


int main ()
 {
   items<10>  i_10;

   for ( unsigned ui = 0U ; ui < 10 ; ++ui )
      i_10.array[ui]();

   return 0;
 }
#include <utility>
#include <iostream>


template<int I>
void fn() { std::cout << "[" << I << "]" << std::endl; }

typedef void(*function_sig)();

template <typename T>
struct itemsH;

template <std::size_t ... RNG>
struct itemsH<std::index_sequence<RNG...>>
 { static function_sig array[sizeof...(RNG)]; };

template<std::size_t ARRAY_SIZE>
struct items : public itemsH<std::make_index_sequence<ARRAY_SIZE>>
 { };

template <std::size_t ... RNG>
function_sig itemsH<std::index_sequence<RNG...>>::array[sizeof...(RNG)]
   = { fn<RNG>... };


int main ()
 {
   items<10>  i_10;

   for ( unsigned ui = 0U ; ui < 10 ; ++ui )
      i_10.array[ui]();

   return 0;
 }