c++ - std::char_traits 中使用的静态方法是一种继承吗?

标签 c++

我正在学习 c++ 字符串中使用的 std::char_traits,然后我意识到 std::char_traits 可用于创建自定义字符串类,如 cplusplus.com's article 中的 case_insensitive_string。 , 我将在下面粘贴代码示例。

// char_traits::compare
#include <iostream>   // std::cout
#include <string>     // std::basic_string, std::char_traits
#include <cctype>     // std::tolower
#include <cstddef>    // std::size_t

// case-insensitive traits:
struct custom_traits: std::char_traits<char> {
    static bool eq (char c, char d) { return std::tolower(c)==std::tolower(d); }
    static bool lt (char c, char d) { return std::tolower(c)<std::tolower(d); }
    static int compare (const char* p, const char* q, std::size_t n) {
        while (n--) {if (!eq(*p,*q)) return lt(*p,*q); ++p; ++q;}
        return 0;
    }
};

int main ()
{
    std::basic_string<char,custom_traits> foo,bar;
    foo = "Test";
    bar = "test";
    if (foo==bar) std::cout << "foo and bar are equal\n";
    return 0;
}

据我所知,静态方法是类的一部分,而不是实例。所以我们不能覆盖静态方法。然而,custom_trais 类显式继承了 char_trais 类。有人知道这是怎么回事吗?谢谢。

最佳答案

OOP(旨在作为“具有虚函数的类”)和泛型编程是不同的编程范例,它们恰好以两种完全不同的方式使用 C++ 的类继承特性来实现其所需的语义。

换句话说:C++ 中的类继承本身 不依赖于特定的编程范例。

在具有类型特征的泛型编程中,OOP 原则根本不适用。你没有什么可以重写的,并且在概念上不存在基类型这样的东西。从 traits 类继承只是一种使代码更易于阅读和编写的有效方法。理论上,您不一定非要这样做,因为您可以为所有不需要专门化的成员委托(delegate)给 std::char_traits:

struct custom_traits { // <------ no inheritance

    static bool eq (char c, char d) { return std::tolower(c)==std::tolower(d); }
    static bool lt (char c, char d) { return std::tolower(c)<std::tolower(d); }
    static int compare (const char* p, const char* q, std::size_t n) {
        while (n--) {if (!eq(*p,*q)) return lt(*p,*q); ++p; ++q;}
        return 0;
    }

    // delegate to std::char_traits:

    static void assign(char& r, const char& a) {
        std::char_traits<char>::assign(r, a);
    }

    static char* assign(char* p, std::size_t count, char a) {
        return std::char_traits<char>::assign(p, count, a);
    }

    // and so on
};

但这有什么好处呢?只是需要编写和阅读更多代码。

关于c++ - std::char_traits 中使用的静态方法是一种继承吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35439576/

相关文章:

c++ - QGis 2.4 C++ helloWorld

c++ - curlpp : undefined reference to symbol 'curl_easy_setopt@@CURL_OPENSSL_3' 的编译问题

c++ - fstream 'outfile' 没有命名类型

c++ - arduino count++ 有限制吗?如何解决?

c++ - 如何在 CListCtrl 中捕获滚动事件?

javascript - 将数据从html传递到QT

c++ - 派生对象的 boost 序列化不调用派生的序列化()

c++ - SSL 握手产生 BIO 错误

c++ - 用c++进行hwid登录(多字节)

c++ - 给定一个 N*M 的矩阵,找到最小值。在最坏的情况下到达特定单元格的步骤?