-1

我的问题是,我不知道如何强制编译器在不使用虚拟参数的情况下推断模板参数。这是一个无效的示例:

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>()...);
}
4

1 回答 1

2

您是否只是缺少类型特征来检测 C 是否为 a 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;
}
于 2013-03-22T10:50:40.880 回答