私の問題は、ダミーパラメーターを使用せずにコンパイラーにテンプレートパラメーターを強制的に推測させる方法がわからないことです。動作しない例を次に示します。
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>()...);
}