C++ C++;0x类型推断与boost::enable\u混淆

C++ C++;0x类型推断与boost::enable\u混淆,c++,boost,c++11,type-inference,enable-if,C++,Boost,C++11,Type Inference,Enable If,我正在尝试编写一个通用的滤波函数,它在多维数组(任意秩)中的给定采样坐标处执行线性插值。为此,我需要一个递归函数模板,它遍历数组的所有维度,直到它找到一个值及其关联类型。我使用boost::enable_if来检测何时停止遍历维度。在我尝试将返回值/类型“过滤”到最顶层的函数之前,它工作正常。为此,我尝试使用C++0x类型推断,但它似乎无法与boost::enable_if很好地结合 我将问题归结为以下几点: template< typename T, std::size_t I >

我正在尝试编写一个通用的滤波函数,它在多维数组(任意秩)中的给定采样坐标处执行线性插值。为此,我需要一个递归函数模板,它遍历数组的所有维度,直到它找到一个值及其关联类型。我使用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]);
}
template
自动测试(const T&T)->typename boost::在c<(I==0)时启用,typename T::value\u type>::type
{
返回t[0];
}
模板
自动测试(const T&T)->typename boost::在c<(I>0)时启用,decltype(test(T())>::type
{
返回测试(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;
typedef std::array,1>myarray;
Myma阵列;

std::cout(ma)).name(),即使指示它使用test的名称。知道为什么会发生这种行为吗?现在,它认为我将把整个过程变成一个函子…

问题是您将一个T()和T传递给decltype。这些类型没有向下折叠。如果将返回表达式与传递给decltype的表达式进行比较,就会清楚地发现这一点——它们是不一致的

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]);
}
template
自动测试(const T&T)->typename boost::在c<(I>0)时启用,decltype(test(T())>::type
{
返回测试(T[0]);
}
decltype:测试
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]);
}