Моя проблема заключается в том, что я не знаю, как заставить компилятор вывести параметры шаблона без использования параметра фиктивного параметра. Вот нерабочим пример:вычитание параметра шаблона для контейнера
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>()...);
}
Как вы называете свой 'create_container()', когда вы не сдадите фиктивный аргумент? –
Вы уверены, что ваш «рабочий пример» работает? 'typename N' кажется неправильным, и это помогло бы, если бы аргументы были именами вместо отдельных букв. –
Кроме того, у вас есть дополнительный угловой кронштейн в нерабочем примере после '> :: type' –