C ++如何使用模板

时间:2016-09-27 20:57:00

标签: c++ templates generics

您好我正在尝试为int,double,null终止字符数组等编写一个通用的isLess比较函数。下面是我的代码,请帮助我理解我们如何使用此函数来处理空终止字符串。

#include<iostream>

using namespace std;

template<typename T>
bool isLess(T &x, T &y)
{
    return x < y;
}

int main()
{
    int a(10), b(20);
    double c(2.0), d(3.0);
    cout<<isLess<int>(a,b)<<endl;
    cout<<isLess<double>(c,d)<<endl;
    //For above types, generic comparator works fine

    //but if we have to compare character represented string, how can we do this in our comparator
    //assume charaters strings are compared the same way as strcmp.


    //char *e = "str1";
    //char *f = "str2";
    //cout<<isLess<char*>(e,f)<<endl;

    return 0;
}

2 个答案:

答案 0 :(得分:1)

您可以使用标准库中的比较器(即std::less)。

那就是说,如果你想为自己定义它们,为什么不使用通用lambda呢?

auto isLess = [](auto &x, auto &y) {
    return x<y;
};

auto isLessStr = [](auto *x, auto *y) {
    // ... Use whatever you want here
};

然后将其用作isLess(a,b)isLessChar(e, f)

答案 1 :(得分:1)

std::less几乎就是标准。

如果您愿意,除了char*之外,您可以滚动自己的功能。一个解决方案是添加一个选择器,该选择器使用您自己的比较器,如果您不为特定类型提供一个,则回退到标准:

struct my_string_compare {
    bool operator()(const char* a, const char* b) const {
        // do whatever you want here.
    }
};

template<typename T>
struct select_less {
    using type = std::less<T>;
};

template<>
struct select_less<char*> {
    using type = my_string_compare;
};

template<typename T>
using my_less = typename select_less<T>::type;

然后,你可以使用你的功能:

my_less<char*> char_less;

if (char_less("string1", "string2")) {
    // ...
}

my_less<int> int_less;

// Same as std::less<int>
if (int_less(7, 9)) {
    // ...
}

如果您需要更多重载,那么您只需添加另一项专业化,这真是太棒了。

另一个优点是您不会覆盖任何标准行为。您可以使用自己的结构,也可以使用标准结构。

有关using执行操作的说明,请参阅typedefUsing-declaration