我想寫一個函數,這種函數在std::tuple<...>
上迭代。迭代本身不會產生關於元組模板類型的任何問題,因爲'...'具有相同的類型(如int,int,int,...)。我使用模板metapgrogramming實現了一個輔助結構'Helper'的工作函數'Foo' - 一切都很好。使用constexpr的替代元組迭代
但是,當我想要使用constexpr函數'helper'來實現替代版本時,編譯器(g ++ 5.2.0)會陷入無限循環的錯誤消息中。從我可以從這些消息中獲得的'position'模板參數被實例化爲可笑的大(== 4294967245)而不是(== 1)。我試圖儘可能使語法和命名儘可能接近。
小例子
#include <tuple>
// template metaprogramming version
template
<class T, std::size_t position>
struct Helper{
static int
help(T tuple) {
return std::get<position>(tuple) +
Helper<T,position - 1>::help(tuple);
}
};
// template metaprogramming version, specialized
template
<class T>
struct Helper<T,0>{
static int
help(T tuple) {
return std::get<0>(tuple);
}
};
// function version, not working
template
<class T, std::size_t position>
constexpr int
helper(T tuple) {
return
0 == position ?
std::get<position>(tuple) + helper<T,position-1>(tuple) :
std::get<0>(tuple);
}
template
<class T>
auto
Foo(T tuple) {
constexpr std::size_t dimension = std::tuple_size<T>::value;
// working version, using the helper struct
return Helper<T,dimension - 1>::help(tuple);
// wrong(?) version, using the constexpr helper function
return helper<T,dimension - 1>(tuple);
}
int main() {
std::tuple<int,int> t(1,1);
Foo(t);
return 0;
}
我的問題:
- 是它主要錯誤嘗試這種迭代的過程中編譯 時間constexpr的功能呢?
- 如果沒有,是編譯器 中的錯誤還是正確的版本應該如何?
我完全知道,由於元組(int,int,...)中的類型相同,所以可以實現與向量類似的版本。但我認爲元組版本在概念上更適合我的問題,並且在運行時更快。
如果您知道元組的所有元素都是同一類型,爲什麼不使用'std :: array'? – mattnewport