繁体   English   中英

函数模板作为函数参数

[英]function template as a function argument

我想实现一个充当MATLAB sort()的函数。 我在头文件中定义了结构和功能模板,如下所示。

template<typename T_val> struct SORT_DATA     
{
    T_val value;                     // 
    int index;
};

template<typename T_var> 
bool ccmp(SORT_DATA<T_var> & var_a, SORT_DATA<T_var> & var_b)
{ 
    return var_a.value < var_b.value;
}

在main()中,我使用一个结构变量,并将ccmp()作为参数传递给C ++ sort(),如下所示。

//SORT_DATA<double> * data1 = new SORT_DATA<double>[15];
SORT_DATA<double> data1[15];

double tmp_data[15] = {25, 23, 1, 32, 0, 43, 98, 8, 7, 11, 34, 52, 32, -53, 6};

for(int i=0; i<15; i++)
{
    data1[i].value = tmp_data[i];
    data1[i].index = i;
}

//sort(data1, data1+15, ccmp);

for(int i=0; i<15; i++)
    std::cout<<setw(5)<<data1[i].value<<"   ";

std::cout<<std::endl;

for(int i=0; i<15; i++)
    std::cout<<setw(5)<<data1[i].index<<"   ";

我遇到几个问题:1.似乎无法为结构变量分配内存。 2.我从VS2010收到一条错误消息,提示函数模板不能用作函数参数。

#pragma once

#include <iostream>
#include <iomanip>
#include <algorithm>
#include "customizedalg.h"  // This is simply the declaration of the struct and bool cmp().


using namespace std;


int main(int argc, char ** argv)
{

    SORT_DATA<double> * data1 = new SORT_DATA<double>[15];
    //SORT_DATA<double> data1[15];

    double tmp_data[15] = {25, 23, 1, 32, 0, 43, 98, 8, 7, 11, 34, 52, 32, -53, 6};

    for(int i=0; i<15; i++)
    {
        data1[i].value = tmp_data[i];
        data1[i].index = i;
    }

    sort(data1, data1+15, ccmp<double>);

    for(int i=0; i<15; i++)
        std::cout<<setw(5)<<data1[i].value<<"   ";

    std::cout<<std::endl;

    for(int i=0; i<15; i++)
        std::cout<<setw(5)<<data1[i].index<<"   ";

    std::cout<<std::endl;

    std::cin.ignore();

    return 0;
}

您应该指定 ccmp函数的模板 ,如Piotr所评论的那样,但是您无需获取函数的地址:

std::sort(data1, data1+15, ccmp<double>);

这是工作样本

而且,如果您的编译器无法使用模板化函数,则可以尝试使用重载的operator()构建结构:

template<typename T_var> 
struct ccmp
{
    bool operator()(SORT_DATA<T_var> & var_a, SORT_DATA<T_var> & var_b) const
    { 
        return var_a.value < var_b.value;
    }
};
...
std::sort(data1, data1+15, ccmp<double>());

样品

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM