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

主要问题是数组会衰减为指针,因此模板函数 addListsizeof() 的值实际上是在尝试获取 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