以下問題:C++庫的本徵:投給固定大小的矩陣
template<int nDim>
void foo (){
Eigen::Matrix<double, nDim, nDim> bar;
if (nDim == 3){
bar = generate_a_special_3x3_Matrix();}
else if (nDim == 2){
bar = generate_a_special_2x2_Matrix();}
// ... further math here
}
等等,當然由於靜態斷言,此代碼不能編譯。然而,它確保在運行時從不發生問題。
目前知道的解決方案是通過.block(3,3)或通過參考< ..>(參見Cast dynamic matrix to fixed matrix in Eigen)的作業。
.block方法:
template<int nDim>
void foo (){
Eigen::Matrix<double, nDim, nDim> bar;
if (nDim == 3){
bar.block(3,3) = generate_a_special_3x3_Matrix();}
else if (nDim == 2){
bar.block(2,2) = generate_a_special_2x2_Matrix();}
// ... further math here
}
然而,這兩種方法都涉及了正確的矩陣大小,這是不是真的有必要運行時檢查,並編寫的代碼是不是真的很美。
我並不在乎運行時開銷(儘管避免它會很好),但是我的眼中寫的代碼並不是很乾淨,因爲.block()的意圖不會立即清除其他人。 有沒有更好的方法,例如像一個演員?
編輯:兩個很好的解決方案發布(如果constexpr),但是,我需要一個C++ 11/14兼容的方法!
本案例中的完美解決方案!謝謝! – macmallow