-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は、最初の例でどのコンテナーをインスタンス化するかを指定しますが、2 番目の例では、ダミー パラメーターに基づいて関数が選択されます。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 が であるかどうかを検出するための型特性が不足しているだけ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 に答える