gpt4 book ai didi

c++ - 在其他语言中是否有等同于 C++ 的类型特征?

转载 作者:行者123 更新时间:2023-11-28 06:33:30 25 4
gpt4 key购买 nike

我喜欢类型特征的概念,因为它以清晰且可扩展的方式解决了一些设计问题。例如,假设我们有几个打印机类和文档类。

由于以后可能会添加新的文档类型,打印机不应该直接知道它正在打印哪个文档,这样就不必再进行调整。另一方面,文档不应该知道所有打印机。

通过提供有关如何打印文档的特征,这是添加新文档时唯一必须修改的地方。此外,如果有新的打印机,他们可以直接使用相同的特性,并专注于与其他打印机不同的内部打印过程。

// Documents
class pdf { /* ... */ };
class txt { /* ... */ };

// Traits
template<typename t>
struct traits; // No default trait, so new documents throw compilation error

template<>
struct traits<pdf> {
static std::string get_title(pdf& document) { /* ... */ }
static std::string get_content(pdf& document) { /* ... */ }
static bool has_images = true;
};

template<>
struct traits<txt> {
static std::string get_title(txt& document) { return ""; } // Not supported
static std::string get_content(txt& document) { /* ... */ }
static bool has_images = false;
};

// Printers
class canon_printer : public printer {
template<typename T>
void print(T document) override
{
std::string title = traits<T>.get_title(document);
// ...
if (traits<T>.has_images)
// ...
}
};

对我来说,它看起来很强大。到目前为止,我只在 C++ 中看到过这个概念。其他编程语言中是否有类似的概念?我更希望为这种方法寻找一个与语言无关的术语,而不是语言列表。

最佳答案

这取决于您使用特征的目的。对于许多用途,一些策略模式的形式将是一个合适的解决方案。你会获得运行时分辨率,而不是编译时间,你真的不能但是,使用它来定义类型。

在您的示例中,即使在 C++ 中,我也不确定您是否需要特征。你的函数 Printer::print 显然是虚拟的(因为你覆盖了它在派生类中),但也是一个模板;这在 C++ 中是不合法的。您可能需要的是桥接模式的一些变体,使用即使在 C++ 中也是虚函数。例如,你可能有一个摘要基类如下:

class DocumentInformation
{
public:
virtual ~DocumentInformation() = default;
virtual std::string get_title() const = 0;
virtual std::string get_content() const = 0;
// ...
virtual bool has_images() const = 0;
};

然后对于每种文档类型,您派生一个具体实例:

class PDFDocumentInformation : public DocumentInformation
{
PDFDocument const& myDocument;
public:
PDFDocumentInformation( PDFDocument const& document )
: myDocument( document )
{
}
std::string get_title() const override
{
// ...
}
// ...
bool has_images() const override { return true; }
};

你是(虚拟的)Printer::print 函数然后需要一个DocumentInformation const&,并用它来获取信息需要。

根据代码的组织方式,您甚至可能不需要桥。通常可以拥有所有具体文件直接从抽象 Document 派生的类,具有虚拟函数,并将其传递给 Printer::print。事实上,这是通常情况;仅当您有现有文件时才需要桥接具有不兼容接口(interface)的类。

关于c++ - 在其他语言中是否有等同于 C++ 的类型特征?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27147581/

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