C++0x 类型推断与 boost::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 >
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< T, I > 的返回值,尽管它被指示使用 test< T, I - 1 > 的返回值。知道为什么会发生这种行为吗?现在,它认为我会把整个东西变成一个仿函数...

最佳答案

问题是您将 T()(和 T)传递给 decltype。这些类型没有 fold 。如果将返回表达式与传递给 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 应该几乎总是与实际的返回表达式完全相同。

编辑:我需要补充一点,你不应该传递右值,而实际上你会传递左值,尤其是传递给模板,因为你最终可能会得到不同的结果。

关于C++0x 类型推断与 boost::enable_if 混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4753642/

相关文章:

c++ - C++中多重继承的限制

c++ - 错误链接以 boost 序列化

c++ - 用字符串中的 2 个键填充映射。字符和频率c++

c++ - 如何在隐藏/显示时保持 QDialog 的位置

c++ - boost mpi 发送 NULL 消息

c++ - 使用 boost::program_options 禁止无符号值的负参数

c++ - 在 C++ 程序上没有可行的重载 '='

c++ - 是否有任何有效的用例可以在现代 C++ 中使用 new 和 delete、原始指针或 c 样式数组?

c++ - 自动参数捕获的推导规则是什么?

c++ - 归并排序实现