Я пытаюсь написать универсальную функцию фильтрации, которая выполняет линейную интерполяцию при заданной координате выборки в многомерном массиве (произвольный ранг).Для этого мне нужен рекурсивный шаблон функции, который проходит по всем измерениям массива, пока не достигнет значения и связанного с ним типа.Я использую boost :: enable_if, чтобы определить, когда прекратить перебирать измерения.Это работает нормально, пока я не попытаюсь «перенаправить» возвращаемое значение / тип в самую верхнюю функцию.Для этой цели я попытался использовать вывод типа C ++ 0x, но, похоже, он плохо сочетается с boost :: enable_if.
Я выделил проблему следующим образом:
template< typename T, std::size_t I >
auto test(const T &t) -> typename boost::enable_if_c< (I == 0), typename T::value_type >::type
{
return t[0];
}
template< typename T, std::size_t I >
auto test(const T &t) -> typename boost::enable_if_c< (I > 0), decltype(test< T, I - 1 >(T())) >::type
{
return test< typename T::value_type, std::size_t(I - 1) >(t[0]);
}
Компилятор (GCC 4.6) жалуется на следующий код:
typedef std::array< std::array< float, 1 >, 1 > myarray;
myarray ma;
std::cout << typeid (test< myarray, 1 >(ma)).name() << std::endl;
Сообщение об ошибке:
error: conversion from 'boost::enable_if_c<true, float>::type' to non-scalar type 'boost::enable_if_c<true, std::array<float, 1u> >::type' requested
Похоже, что decltype использует возвращаемое значение из теста даже если указано, что использовать тест .Есть идеи, почему такое поведение происходит?Пока что, думаю, я просто превращу все это в функтор ...