模板化功能中的比较

时间:2019-02-05 00:17:13

标签: c++

我正在编写一个模板化函数,该函数有时会进行比较

template<typename T>
void Foo(T val)
{
    .
    .
    .

    if(val != 0) // what if val is of type std::string?
    {
        doSomething();
    }
}

这适用于整数数据,但是如果T是std :: string怎么办?我应该如何处理该条件,以便可以在函数中同时使用std :: string和int?

1 个答案:

答案 0 :(得分:-2)

编辑:忽略我在下面键入的所有内容,仅使用模板专门化。

如果您还必须考虑字符串的可能性,则由于比较不同,您将不得不构建另一个函数来处理这些字符串,请使用函数重载而不是尝试将其与用于处理Integer的模板一起编译,浮标,双打等。您可以使用.compare(anotherstring or "") == 0 .empty() .length() == 0。如果您不熟悉这三个标准操作,我建议您仔细阅读。您的字符串处理函数将如下所示(取决于最适合您情况的子句):

void Foo(std::string val)
{
    .
    .
    .

    if (val.length() == 0) {
        std::cout << "string is of 0 length\n";
    } else {
        std::cout << "string is of " << thing.length() << " length\n";
    }


    if (val.compare("") == 0) {
        std::cout << "string is a blank string\n";
    } else {
        std::cout << "string is not a blank string\n";
    }

    if (val.empty()) {
        std::cout << "string is empty\n";
    } else {
        std::cout << "string is not empty\n";
    }

}

您甚至可以在一个大的检查器中or将它们全部短路,并且不继续检查第一个检查器是否恢复原状,尽管在某些情况下这可能是多余的。像这样:

if (val.compare("") == 0 || val.length == 0 || val.empty()) { doSomething(); }

希望这对您有所帮助并且编码愉快