2015-01-26 85 views
-1

如果我想要爲具有匹配接口的兩個集合使用複雜的函數(至少就涉及的函數而言),是否有一種方法可以重新使用模板代碼?對不同的參數使用相同的模板函數?

例如:

void DoSomethingIntense(std::vector<blah> myBlah); 
void DoSomethingIntense(std::array<blah> myBlah); 

如果使用開始,結束,大小,並且這兩個陣列和矢量共同具有的其它功能,是有辦法重新使用DoSomethingIntense的主體而無需鍵入它兩次(或者,天堂禁止,把它塞進一個宏)?

(請不要雞蛋裏挑骨頭的示例代碼,它並不能幫助任何人)

UPDATE:我的道歉,我忘了提及有問題的功能有其他實現方式爲不此簽名匹配類;只是讓每個參數都使用適用於這兩個參數的代碼不是一個選項。

我認爲在這種情況下迭代器解決方案可能是最好的。

+0

是不是你需要的模板函數?我很困惑,因爲你的問題包含明顯的答案... – 2015-01-26 19:13:26

+0

這不是一個模板函數,但也許它應該是。 – tadman 2015-01-26 19:14:04

回答

1

是的,你可以通過使用模板實現這一目標:

template<typename T> 
void DoSomethingIntense(const T &myBlah); 

編輯:

如果我讓你更新正確的話,我會說,化妝用的SFINEA

template<typename T> 
struct is_vector : std::false_type {}; 

template<typename T, typename A> 
struct is_vector<std::vector<T, A>> : std::true_type {}; 

template<typename T> 
struct is_array : std::false_type {}; 

template<typename T, size_t N> 
struct is_array<std::array<T, N>> : std::true_type {}; 

// add more if you want or define a macro 

template<typename T> 
std::enable_if_t<is_vector<T>::value || is_array<T>::value, void> 
DoSomethingIntense(const T &myBlah) 
{ 
} 

int main() 
{ 
    std::vector<int> v; 
    DoSomethingIntense(v); // OK 

    std::array<float, 5> a; 
    DoSomethingIntense(a); // OK 

    std::queue<int> q; 
    DoSomethingIntense(q); // ERROR 
} 
3

是,使用模板。

template <typename Container> 
void DoSomethingIntense(Container blah) { // Might be better as Container const & 
    // write code using blah.begin() or whatever 
} 

您也許能使其更加通用,以下STL的例子,通過支持一般的迭代器區間,而不是專門的容器:

template <typename Iterator> 
void DoSomethingIntense(Iterator begin, Iterator end); 
0

你可以混合模板/過載。沒問題。

例如:

template <typename T> 
void DoSomethingIntense(T myBlah) { 

} 

void DoSomethingIntense(MyCustomClass myBlah) { 

} 

然後,它會使用參數類型MyCustomClass和非模板版本的模板版本爲別的(如vectorarray

而且,你可以使用std::enable_if限制可能的模板參數的範圍。另見this question

相關問題