gpt4 book ai didi

c++ - 通过模板和继承避免代码重复

转载 作者:行者123 更新时间:2023-12-02 10:04:25 25 4
gpt4 key购买 nike

假设我有一堆看起来都很相似的域类:它们基于字符串值,并且相同的值重复很多,因此它们都使用相同的复制粘贴代码来内联基础值。因此,我决定使用避免代码重复的模板:

#include <string>
#include <memory>

template<typename T>
class InternedString {
public:
InternedString(std::string value) {
//interning the string
}

std::size_t hash() {
//compute hash
}

//other methods for constructors and operator overloading
private:
std::shared_ptr<std::string> interned_value;
};

它适用于大多数 Realm 类。类型是不可互换的,这就是我想要的。
struct NameTag{};
typedef InternedString<NameTag> Name;
struct AddressTag{};
typedef InternedString<AddressTag> Address;

Address address = Name("test name"); //doesn't compile, just like I want

其他两个 Realm 类不适合此模板。它们需要附加的构造函数字段和某些方法的不同定义。所以看起来继承是解决问题的方法:
struct CompanyTag{};
class Company : InternedString<CompanyTag> {
public:
Company(int id, const std::string& value) : InternedString(value), id(id) {}

//override hash method
private:
int id;
};

我有几个问题:
  • 可以(应该)仅通过模板来实现此功能吗?
  • ,因为我使用继承,是否应该删除template参数,然后只为NameAddress定义子类?
  • 我不喜欢继承,因为它经常被滥用。当前方案是否证明使用继承是合理的?
  • 最佳答案

    我认为继承是合理的。但是,我将更改NameAddress的定义,以使其与Company保持一致。

    struct NameTag{};
    struct Name : InternedString<NameTag>
    {
    using InternedString<NameTag>::InternedString;
    };

    struct AddressTag{};
    struct Address : InternedString<AddressTag>
    {
    using InternedString<AddressTag>::InternedString;
    };

    这些类中的 using指令使基类构造函数进入派生类的范围,并允许它们使用:
    Name n("A name");
    Address a("An Address");

    关于c++ - 通过模板和继承避免代码重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60974842/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com