容器的模板参数扣除

时间:2013-03-22 10:45:15

标签: c++ c++11

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

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 个答案:

答案 0 :(得分:2)

您是否只是缺少类型特征来检测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;
}