我想寫一個通用的過濾函數,在多維數組(任意級別)的給定採樣座標處執行線性插值。爲此,我需要一個遞歸函數模板,遍歷數組的所有維度,直到它遇到一個值及其相關類型。我使用boost :: enable_if來檢測何時停止遍歷維度。它工作正常,直到我試圖「滲透」返回值/類型到最頂層的函數。爲此,我試圖使用C++ 0x類型推斷,但它似乎沒有與boost :: enable_if良好混合。C++ 0x類型推斷使用boost :: enable_if messes
予分離的問題降低到什麼如下:
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使用來自測試< T的返回值,即使它被指示使用測試< T,I - 1>。任何想法爲什麼發生這種行爲?現在,它認爲我只是把整個事情變成一個仿函數...
我錯過了那個,非常感謝! – pmjobin 2011-01-20 23:52:00