代码之家  ›  专栏  ›  技术社区  ›  user1095108

容器的模板参数推导

  •  -1
  • user1095108  · 技术社区  · 12 年前

    我的问题是,我不知道如何在不使用伪参数的情况下强制编译器推导模板参数。下面是一个不起作用的例子:

    template<int I, class C, class T, std::size_t N>
    inline typename std::enable_if<
      std::is_same<C, std::array<T, N> >::value,
      std::array<T, N> >::type
    create_container()
    {
      std::array<T, N> array;
      // I is used somewhere
      return array;
    }
    

    以下是一个工作示例:

    template<int I, typename T, std::size_t N>
    std::array<T, N> create_container(std::array<T, N> const&) // dummy parameter helps deduction
    {
      std::array<T, N> array;
      // I is used somewhere
      return array;
    }
    

    模板参数 C 在第一个示例中指定要实例化的容器,但在第二个示例中,函数是基于伪参数选择的。SFINAE或其他魔法可能吗?我们想到了部分模板专门化,但函数模板是不可能的。

    create_container 是这样称呼的:

    template <std::size_t O, typename R, typename ...A, std::size_t ...I>
    inline R forward(R (*f)(A...), indices<I...>)
    {
      return (*f)(create_container<I + O, A>()...);
    }
    
    1 回复  |  直到 12 年前
        1
  •  2
  •   Daniel Frey    12 年前

    你只是缺少了一个类型特征来检测C是否是一个 std::array<T,N> ? 如果是:

    template< typename >
    struct is_std_array : std::false_type {};
    
    template< typename T, std::size_t N >
    struct is_std_array< std::array< T, N > > : std::true_type {};
    

    template<int I, typename C>
    typename std::enable_if< is_std_array< C >::value, C >::type create_container()
    {
       C container;
    
       // to access T and N from std::array<T,N>, use this:
       typedef typename C::value_type T;
       constexpr std::size_t N = container.size();
    
       // I is used somewhere
       return container;
    }