2013-03-22 3 views
-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>()...); 
} 
+1

Как вы называете свой 'create_container()', когда вы не сдадите фиктивный аргумент? –

+0

Вы уверены, что ваш «рабочий пример» работает? 'typename N' кажется неправильным, и это помогло бы, если бы аргументы были именами вместо отдельных букв. –

+0

Кроме того, у вас есть дополнительный угловой кронштейн в нерабочем примере после '> :: type' –

ответ

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; 
} 
+0

Мне нужно знать' T' и 'N' в теле функции. – user1095108

+0

@ user1095108: Отредактировано. –

+0

Невозможно было бы изменить 'is_std_array' для хранения T и N где-нибудь, например,' typedef' и 'const static' member? – user1095108

Смежные вопросы