C++模板参数sizeof返回不正确的结果

C++ Template Parameter sizeof Returns Incorrect Result

本文关键字:不正确 结果 返回 sizeof 参数 C++      更新时间:2024-09-29

这样我就可以找到数组中元素的数量。然而,当我把这个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;
}

总字节:8字节/单位:4 arrSize:2

MasterListSizeOf:2
MasterList:Members=>gt>1-2

数组用数字1,2,3,4,5填充,虽然传递了5个单位,但返回值为1和2。

我可能还想从下面的类中创建当前在INT类型中使用的列表。

list<TradeList> 
class TradeList
{
public:
int      PosTicket  ;
strinh   Pairs      ;
double   OpenPrice  ;
double   StopLoss   ;
double   TakeProfit ;
}

相信我,我无法通过我的研究找到解决这个问题的办法。

非常感谢你的帮助。

主要问题是数组衰减为指针,因此模板函数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

数组衰减为指针,如果您需要模板函数中数组的大小,可以将函数更改为以下。

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;
}

我不认为这是浪费时间。处理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;
}