C ++ 0x类型推断混淆了boost :: enable_if

我正在尝试编写一个通用过滤函数,它在多维数组(任意等级)中的给定采样坐标处执行线性插值。为此,我需要一个递归函数模板,它遍历数组的所有维度,直到它达到一个值及其相关类型。我使用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使用了test&lt;的返回值。 T,I>即使它被指示使用测试&lt; T,I - 1>。知道为什么会出现这种情况吗?现在,它认为我会把整个事情变成一个算子......     
已邀请:
问题是您将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]);
}
decltype: test<T
return expression: test< typename T::value_type
在定义这样的前向函数时,用于定义返回类型的decltype-expression应该几乎总是与实际的返回表达式完全相同。 编辑:我需要补充一点,你不应该传递rvalues,而实际上你会传递左值,特别是模板,因为你可能会得到不同的结果。     

要回复问题请先登录注册