我是 C 模板的初學者,我想知道是否可以將容器傳遞給模板函式的型別名,這是我想要做的:
template <typename T>
int find_size(const T<int> t)
{
return (t.size());
}
int main(void)
{
std::array<int, 10> test;
for (int i = 0; i < 10; i )
{
test[i] = i;
}
findsize(test);
}
當我編譯時,我收到一條錯誤訊息,指出 T 不是模板。是否可以將容器的模板傳遞給函式的模板?
uj5u.com熱心網友回復:
只需進行最少的更改即可使其作業,您的代碼可能是這樣的:
#include <array>
template <typename T>
int find_size(const T& t)
{
return (t.size());
}
int main(void)
{
std::array<int, 10> test;
for (int i = 0; i < 10; i )
{
test[i] = i;
}
find_size(test);
}
基本上我希望我的函式能夠采用 abritary 型別的容器
這正是上面所做的。它適用于任何T具有size().
如果您確實想對find_size模板而不是型別進行引數化,那么您可以使用模板模板引數:
#include <array>
template <template<class,std::size_t> class C>
int find_size(const C<int,10>& t)
{
return (t.size());
}
int main(void)
{
std::array<int, 10> test;
for (int i = 0; i < 10; i )
{
test[i] = i;
}
find_size<std::array>(test);
}
但是,使用它要么比此處說明的更復雜,要么比上面的用途更有限:對于函式引數,您需要一個型別而不僅僅是一個模板,這find_size僅適用于C具有 2 個引數的模板,一個型別和型別的一個非型別引數size_t(實際上我不知道任何其他容器,但std::array具有該模板引數)。
TL;DR:這不是需要模板模板引數的用例。
是否可以將容器的模板傳遞給函式的模板?
是的,但你在這里不需要它。
uj5u.com熱心網友回復:
您可以將您的型別傳遞給您的模板化函式。編譯器將檢查對這個函式的呼叫是否有效(即:它會檢查對你的函式的每次呼叫是否都是使用具有size()方法的物件完成的)。
我修復了你的代碼,試試看是否有效(未經測驗)
template <typename T>
int find_size(const T &v)
{
return int(v.size());
}
int main()
{
std::array<int, 10> test;
for (int i = 0; i < 10; i )
{
test[i] = i;
}
find_size(test);
return 0;
}
uj5u.com熱心網友回復:
T 是一個型別名稱,所以呼叫 .size() 在這里沒有意義。
如果您想要一個型別的引數,為什么要嘗試使用模板?你可以輸入你的回報。
嘗試
template <typename T>
int find_size(T a)
{
return (int) a.size();
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/358917.html
標籤:C 模板 容器 c -standard-library
