Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Templates 这些将安全数组转换为std::list对象的方法能否转换为模板函数?_Templates_Visual C++_Mfc_Safearray - Fatal编程技术网

Templates 这些将安全数组转换为std::list对象的方法能否转换为模板函数?

Templates 这些将安全数组转换为std::list对象的方法能否转换为模板函数?,templates,visual-c++,mfc,safearray,Templates,Visual C++,Mfc,Safearray,采用以下三种方法,分别从安全数组构建不同的std::list对象: void CMSATools::ConvertSAFEARRAY_DISCUSSIONITEMS(SAFEARRAY* psaDiscussionItems, ListDiscussionItems& rListDiscussionItems) { MSAToolsLibrary::IDiscussionItemPtr* pVals = nullptr; HRESULT hr = SafeArrayAcc

采用以下三种方法,分别从安全数组构建不同的
std::list
对象:

void CMSATools::ConvertSAFEARRAY_DISCUSSIONITEMS(SAFEARRAY* psaDiscussionItems, ListDiscussionItems& rListDiscussionItems)
{
    MSAToolsLibrary::IDiscussionItemPtr* pVals = nullptr;
    HRESULT hr = SafeArrayAccessData(psaDiscussionItems, (void**)&pVals); // direct access to SA memory

    if (SUCCEEDED(hr))
    {
        long lowerBound, upperBound;  // get array bounds
        hr = SafeArrayGetLBound(psaDiscussionItems, 1, &lowerBound);
        if (FAILED(hr))
            throw _com_error(hr);

        hr = SafeArrayGetUBound(psaDiscussionItems, 1, &upperBound);
        if (FAILED(hr))
            throw _com_error(hr);

        rListDiscussionItems.clear();
        long cnt_elements = upperBound - lowerBound + 1;
        for (int i = 0; i < cnt_elements; ++i)  // iterate through returned values
        {
            rListDiscussionItems.push_back(pVals[i]);
        }
        hr = SafeArrayUnaccessData(psaDiscussionItems);
        if (FAILED(hr))
            throw _com_error(hr);
    }
    else
    {
        throw _com_error(hr);
    }

    hr = SafeArrayDestroy(psaDiscussionItems);
    if (FAILED(hr))
        throw _com_error(hr);
}

void CMSATools::ConvertSAFEARRAY_STUDENTITEMS(SAFEARRAY* psaStudentItems, ListStudentItems& rListStudentItems)
{
    MSAToolsLibrary::IStudentItemPtr    *pVals = nullptr;
    HRESULT hr = SafeArrayAccessData(psaStudentItems, (void**)&pVals); // direct access to SA memory

    if (SUCCEEDED(hr))
    {
        long lowerBound, upperBound;  // get array bounds
        hr = SafeArrayGetLBound(psaStudentItems, 1, &lowerBound);
        if (FAILED(hr))
            throw _com_error(hr);

        hr = SafeArrayGetUBound(psaStudentItems, 1, &upperBound);
        if (FAILED(hr))
            throw _com_error(hr);

        rListStudentItems.clear();
        long cnt_elements = upperBound - lowerBound + 1;
        for (int i = 0; i < cnt_elements; ++i)  // iterate through returned values
        {
            rListStudentItems.push_back(pVals[i]);
        }
        hr = SafeArrayUnaccessData(psaStudentItems);
        if (FAILED(hr))
            throw _com_error(hr);
    }
    else
    {
        throw _com_error(hr);
    }

    hr = SafeArrayDestroy(psaStudentItems);
    if (FAILED(hr))
        throw _com_error(hr);
}

void CMSATools::ConvertSAFEARRAY_DUTYHISTORYITEMS(SAFEARRAY* psaHistoryItems, ListDutyHistoryLookupItems& rListHistoryItems)
{
    MSAToolsLibrary::IDutyAssignmentLookupPtr   *pVals = nullptr;
    HRESULT hr = SafeArrayAccessData(psaHistoryItems, (void**)&pVals); // direct access to SA memory

    if (SUCCEEDED(hr))
    {
        long lowerBound, upperBound;  // get array bounds
        hr = SafeArrayGetLBound(psaHistoryItems, 1, &lowerBound);
        if (FAILED(hr))
            throw _com_error(hr);

        hr = SafeArrayGetUBound(psaHistoryItems, 1, &upperBound);
        if (FAILED(hr))
            throw _com_error(hr);

        rListHistoryItems.clear();
        long cnt_elements = upperBound - lowerBound + 1;
        for (int i = 0; i < cnt_elements; ++i)  // iterate through returned values
        {
            rListHistoryItems.push_back(pVals[i]);
        }
        hr = SafeArrayUnaccessData(psaHistoryItems);
        if (FAILED(hr))
            throw _com_error(hr);
    }
    else
    {
        throw _com_error(hr);
    }

    hr = SafeArrayDestroy(psaHistoryItems);
    if (FAILED(hr))
        throw _com_error(hr);
}
void CMSATools::ConvertSAFEARRAY_DISCUSSIONITEMS(SAFEARRAY*PSASDiscussionItems、ListDiscussionItems和rListDiscussionItems)
{
MSAToolsLibrary::IDiscussionItemPtr*pVals=nullptr;
HRESULT hr=SafeArrayAccessData(psaDiscussionItems,(void**)和pVals);//直接访问SA内存
如果(成功(hr))
{
long lowerBound,上限;//获取数组边界
hr=安全阵列etlbund(psaDiscussionItems,1和lowerBound);
如果(失败(小时))
抛出com错误(hr);
hr=安全阵列etubound(psaDiscussionItems,1和上限);
如果(失败(小时))
抛出com错误(hr);
rListDiscussionItems.clear();
长cnt_元素=上限-下限+1;
for(int i=0;i
它们都工作正常,功能正常。但他们有很多共同点。这里可以使用“模板”吗?这不是我以前做过的事情

我不介意使用三个不同的方法,但是如果它们可以调用一个通用的模板方法来转换安全数组,那么代码维护就会更容易

有意义吗?

试试这个(没有编译):

模板
void CMSATools::ConvertSAFEARRAY_DUTYHISTORYITEMS(SAFEARRAY*PSATItems,to&rItems)
{
from*pVals=nullptr;
HRESULT hr=SafeArrayAccessData(psaItems,(void**)和pVals);//直接访问SA内存
如果(成功(hr))
{
long lowerBound,上限;//获取数组边界
hr=安全阵列etlbund(PSATems、1和lowerBound);
如果(失败(小时))
抛出com错误(hr);
hr=安全阵列etubound(PSA项目、1和上限);
如果(失败(小时))
抛出com错误(hr);
rItems.clear();
长cnt_元素=上限-下限+1;
for(int i=0;i
试试这个(没有编译):

模板
void CMSATools::ConvertSAFEARRAY_DUTYHISTORYITEMS(SAFEARRAY*PSATItems,to&rItems)
{
from*pVals=nullptr;
HRESULT hr=SafeArrayAccessData(psaItems,(void**)和pVals);//直接访问SA内存
如果(成功(hr))
{
long lowerBound,上限;//获取数组边界
hr=安全阵列etlbund(PSATems、1和lowerBound);
如果(失败(小时))
抛出com错误(hr);
hr=安全阵列etubound(PSA项目、1和上限);
如果(失败(小时))
抛出com错误(hr);
rItems.clear();
长cnt_元素=上限-下限+1;
for(int i=0;i
是的,看起来这些函数的主体非常相似,应该是f
template<typename from, typename to>
void CMSATools::ConvertSAFEARRAY_DUTYHISTORYITEMS(SAFEARRAY* psaItems, to& rItems)
{
  from   *pVals = nullptr;
  HRESULT hr = SafeArrayAccessData(psaItems, (void**)&pVals); // direct access to SA memory

  if (SUCCEEDED(hr))
  {
    long lowerBound, upperBound;  // get array bounds
    hr = SafeArrayGetLBound(psaItems, 1, &lowerBound);
    if (FAILED(hr))
      throw _com_error(hr);

    hr = SafeArrayGetUBound(psaItems, 1, &upperBound);
    if (FAILED(hr))
      throw _com_error(hr);

    rItems.clear();
    long cnt_elements = upperBound - lowerBound + 1;
    for (int i = 0; i < cnt_elements; ++i)  // iterate through returned values
    {
      rItems.push_back(pVals[i]);
    }
    hr = SafeArrayUnaccessData(psaItems);
    if (FAILED(hr))
      throw _com_error(hr);
  }
  else
  {
    throw _com_error(hr);
  }

  hr = SafeArrayDestroy(psaItems);
  if (FAILED(hr))
    throw _com_error(hr);
}