2017-04-05 122 views
0

我正在移植一個ComputerVision項目到OpenFrameworks現在和它的一部分是模擬庫的一些小部分,爲此我正在編寫我自己的,更輕量級的輔助類。如何定義使用模板類的模板函數,但沒有該類的所有參數?

我有向量和矩陣爲此我使用OpenCV的cv::Veccv::Matx。它們是一些功能很少的簡單容器,但大多數情況下很好。

我嘗試模擬的功能是切片功能。基本上取一行Matrix並返回一個Vector,或者取一個矢量的子集並返回那個較小的矢量。現在,我有這樣的事情:

template<typename Precision, int Start, int Length, int X> 
cv::Vec<Precision, Length> slice(cv::Vec<Precision, X> v) 
{ 
    assert(Start >= 0); 
    assert((Start+Length) <= X); 

    cv::Vec<Precision, Length> temp; 

    for (int i = 0; i < Length; i++) 
     temp[i] = v[Start+i]; 

    return temp; 
} 

而且我會像這樣使用:

cv::Vec<double, 3> newVector = ImpUtil::slice<double, 3, 3, VectorLength>(vector); 

cv::Vec沒有一個成員告訴你長期是這樣,所以我必須在經過長無論如何現在。這就是爲什麼我打算在某個時候寫出自己的課程的原因之一。

問題是我正在使用使用模板類的模板函數。然而,整個功能的一部分純粹是針對班級的,我想知道是否可以以某種方式放棄它(是的,這意味着現在放棄'斷言')。該函數應該適用於任何長度的向量,並且除了assert(我可以從某個點的向量獲得)之外,它在函數中沒有用處。

+0

您沒有按照它應該使用的方式使用'cv :: Vec'。使用'std :: vector'或者'std :: array' – Miki

+0

我不能說我正確地使用了'cv :: Vec'('cv ::'有幾個Vector類),但是'std ::矢量「絕對是另一回事。我需要使用點和跨產品的數學結構,而不是數組。 –

+0

那麼爲什麼不用一個單行/列使用'cv :: Mat'呢?在我看來,你是過於複雜的東西 – Miki

回答

1

我想猜這裏有什麼問題。

我猜你正在試圖解決的問題是不必指定「明顯」的模板參數顯式:

cv::Vec<double, VectorLength> vector; // did I guess this declaration right? 
... 
cv::Vec<double, 3> newVector = ImpUtil::slice<double, 3, 3, VectorLength>(vector); 

在這段代碼中,很明顯,vector是一個長度爲3,幷包含double,但你必須在slice的尖括號中指定它。

如果這是您正在嘗試解決的問題,只需重新排列模板參數,以便「明顯」的參數結束。如果你沒有指定所有的模板參數,the compiler will deduce the missing ones at the end

template<int Start, int Length, typename Precision, int X> 
cv::Vec<Precision, Length> slice(cv::Vec<Precision, X> v); 

... 

cv::Vec<double, VectorLength> vector; // I guessed this declaration 
... 
cv::Vec<double, 3> newVector = ImpUtil::slice<3, 3>(vector); 
+0

是的,這就是我的意思,但不是隻有在編譯時已知X才能工作?在某些情況下,我正在經歷動態長度的循環,並且X沒有修復。 –

相關問題