C++ 模板参数 sizeof Returns 不正确的结果
C++ Template Parameter sizeof Returns Incorrect Result
这样我就可以找到数组中元素的数量。但是,当我把这个int数组作为模板作为参数时,结果计算不正确
int arr[] = {1,2,3,4,5};
int size_arr = sizeof(arr) / sizeof(arr[0]);
我将一个 INT 数组作为类型模板的参数添加到列表中。
template <typename listType, typename arrayX>
listType addList(listType e , arrayX array)
{
int sizeOf = sizeof(array);
int sizeOfperOne = sizeof(array[0]);
int arrSize = sizeOf / sizeOfperOne ;
cout << "Total Byte : " << sizeOf << " BytePerUnit : " << sizeOfperOne << " arrSize : " << arrSize<< endl;
for (int i = 0; i < arrSize; i++)
{
e.push_back(array[i]);
}
return e;
}
并创建了另一个模板和方法来打印此列表内容
template <typename T>
void print(T& t, string name)
{
typename T::iterator i = t.begin();
cout << name << "\tMembers ==>>> ";
while (i != t.end())
{
if (i == t.begin())
{
cout << *i++;
}
else
{
cout << " - " << *i++;
}
}
cout << endl;
}
int main()
{
int mlArray[] = { 1,2,3,4,5};
list<int> MasterListe ;
MasterListe = addList(MasterListe, mlArray);
cout << "MasterListe SizeOf : " << MasterListe.size() << endl;
print(MasterListe, "MasterList : ");
return 0;
}
Total Byte : 8 BytePerUnit : 4 arrSize : 2
MasterListe SizeOf : 2
MasterList : Members ==>>> 1 - 2
数组填入数字1,2,3,4,5,虽然传了5个单位,return值为1和2
我可能还想从下面的 class 中创建我当前使用的 INT 类型的列表。
list<TradeList>
class TradeList
{
public:
int PosTicket ;
strinh Pairs ;
double OpenPrice ;
double StopLoss ;
double TakeProfit ;
}
相信我,我无法通过研究找到解决方案。
非常感谢您的帮助。
我不认为这是浪费时间。
处理 Main 方法中的额外操作。
template <typename listType, typename arrayX>
listType InsertList(listType e, arrayX array, int size)
{
for (int i = 0; i < size; i++)
{
e.push_back(array[i]);
}
return e;
}
主要方法
int main()
{
int mlArray[] = { 1,2,3,4,5,6,7,8,9};
list<int> SecondList;
ThirdList= InsertList(SecondList, mlArray, size(mlArray));
print(SecondList, "SecondList : ");
return 0;
}
数组衰减为指针,如果您需要模板函数中数组的大小,您可以将函数更改为以下。
template <typename listType, std::size_t N, typename arrayX>
listType addList(listType e , arrayX (&array)[N] )
{
int sizeOf = sizeof(array);
int sizeOfperOne = sizeof(array[0]);
int arrSize = N;
cout << "Total Byte : " << sizeOf
<< " BytePerUnit : " << sizeOfperOne
<< " arrSize : " << arrSize
<< endl;
for (int i = 0; i < N; i++)
{
e.push_back(array[i]);
}
return e;
}
主要问题是数组会衰减为指针,因此模板函数 addList
中 sizeof()
的值实际上是在尝试获取 sizeof(int *)
.
如果 addList
所做的只是将项目添加到 std::list
,有通用的方法可以做到这一点而无需创建另一个函数。
一种方法是使用 std::copy_n:
#include <iostream>
#include <list>
#include <algorithm>
#include <iterator>
#include <string>
class TradeList
{
public:
int PosTicket ;
std::string Pairs ;
double OpenPrice ;
double StopLoss ;
double TakeProfit ;
};
int main()
{
TradeList mlArray[5];
std::list<TradeList> MasterListe;
std::copy_n(mlArray, std::size(mlArray), std::inserter(MasterListe, MasterListe.end()));
std::cout << MasterListe.size();
}
输出:
5
这样我就可以找到数组中元素的数量。但是,当我把这个int数组作为模板作为参数时,结果计算不正确
int arr[] = {1,2,3,4,5};
int size_arr = sizeof(arr) / sizeof(arr[0]);
我将一个 INT 数组作为类型模板的参数添加到列表中。
template <typename listType, typename arrayX>
listType addList(listType e , arrayX array)
{
int sizeOf = sizeof(array);
int sizeOfperOne = sizeof(array[0]);
int arrSize = sizeOf / sizeOfperOne ;
cout << "Total Byte : " << sizeOf << " BytePerUnit : " << sizeOfperOne << " arrSize : " << arrSize<< endl;
for (int i = 0; i < arrSize; i++)
{
e.push_back(array[i]);
}
return e;
}
并创建了另一个模板和方法来打印此列表内容
template <typename T>
void print(T& t, string name)
{
typename T::iterator i = t.begin();
cout << name << "\tMembers ==>>> ";
while (i != t.end())
{
if (i == t.begin())
{
cout << *i++;
}
else
{
cout << " - " << *i++;
}
}
cout << endl;
}
int main()
{
int mlArray[] = { 1,2,3,4,5};
list<int> MasterListe ;
MasterListe = addList(MasterListe, mlArray);
cout << "MasterListe SizeOf : " << MasterListe.size() << endl;
print(MasterListe, "MasterList : ");
return 0;
}
Total Byte : 8 BytePerUnit : 4 arrSize : 2
MasterListe SizeOf : 2
MasterList : Members ==>>> 1 - 2
数组填入数字1,2,3,4,5,虽然传了5个单位,return值为1和2
我可能还想从下面的 class 中创建我当前使用的 INT 类型的列表。
list<TradeList>
class TradeList
{
public:
int PosTicket ;
strinh Pairs ;
double OpenPrice ;
double StopLoss ;
double TakeProfit ;
}
相信我,我无法通过研究找到解决方案。
非常感谢您的帮助。
我不认为这是浪费时间。 处理 Main 方法中的额外操作。
template <typename listType, typename arrayX>
listType InsertList(listType e, arrayX array, int size)
{
for (int i = 0; i < size; i++)
{
e.push_back(array[i]);
}
return e;
}
主要方法
int main()
{
int mlArray[] = { 1,2,3,4,5,6,7,8,9};
list<int> SecondList;
ThirdList= InsertList(SecondList, mlArray, size(mlArray));
print(SecondList, "SecondList : ");
return 0;
}
数组衰减为指针,如果您需要模板函数中数组的大小,您可以将函数更改为以下。
template <typename listType, std::size_t N, typename arrayX>
listType addList(listType e , arrayX (&array)[N] )
{
int sizeOf = sizeof(array);
int sizeOfperOne = sizeof(array[0]);
int arrSize = N;
cout << "Total Byte : " << sizeOf
<< " BytePerUnit : " << sizeOfperOne
<< " arrSize : " << arrSize
<< endl;
for (int i = 0; i < N; i++)
{
e.push_back(array[i]);
}
return e;
}
主要问题是数组会衰减为指针,因此模板函数 addList
中 sizeof()
的值实际上是在尝试获取 sizeof(int *)
.
如果 addList
所做的只是将项目添加到 std::list
,有通用的方法可以做到这一点而无需创建另一个函数。
一种方法是使用 std::copy_n:
#include <iostream>
#include <list>
#include <algorithm>
#include <iterator>
#include <string>
class TradeList
{
public:
int PosTicket ;
std::string Pairs ;
double OpenPrice ;
double StopLoss ;
double TakeProfit ;
};
int main()
{
TradeList mlArray[5];
std::list<TradeList> MasterListe;
std::copy_n(mlArray, std::size(mlArray), std::inserter(MasterListe, MasterListe.end()));
std::cout << MasterListe.size();
}
输出:
5