【问题标题】:c++ how to make constructor for typedef typec ++如何为typedef类型制作构造函数
【发布时间】:2020-11-23 14:16:21
【问题描述】:

在我的 c++ 项目中,我有一个名为 Expression 的类型

typedef std::function<uint64_t(uint64_t)> Expression;

我还有一个类似构造函数的函数

Expression ExpressionConstructor(std::string Expr, MicroCodeDescriptor* descriptor) {
//implementation doesn't matter in this case
}

这段代码有效,我可以像这样使用表达式类型:

Expression expr= ExpressionConstructor(code, descriptor);

但是有没有办法为 Expression 声明一个构造函数,它在语法上像构造函数而不是像一个单独的函数一样工作,我看不出有任何理由说明这根本不可能,因为构造函数只是具有返回类型的函数他们构造的类。

【问题讨论】:

  • ExpressionConstructor 看起来像一个工厂函数,除了它有一个奇怪的名称。您不想使用工厂函数并且需要行为类似于构造函数的东西的原因是什么?。
  • 构造函数没有 any 返回类型。构造函数和析构函数是“特殊”函数,它们没有名字,不返回任何东西,也不能被调用。
  • @GideonMax 标准(参见[special] 部分。)对此非常明确:“构造函数没有名称。” (因此,您不能在调用或其他任何事情中引用它)和“构造函数用于初始化其类类型的对象。” (因此,它不创建对象,更不用说返回一个对象。)编译器当然可以引用构造函数并调用它,但你不能,编译器使用什么名称以及如何调用它是完全不相关的实现细节.
  • @molbdnilo 1. 构造函数接收将用于对象的地址并返回它,反汇编不会说谎。 2. ``` CodeTreePart part(str); CodeTreePart 部分=CodeTreePart::CodeTreePart(str); ```这两行代码(几乎)是等价的,并且都有效且有效(我对此进行了测试)不确定您指的是什么,但现实世界不同意,您确定您没有阅读旧的 c++ 标准吗? p.s.两行之间的区别在于第二个初始化然后分配,第一个只是初始化
  • @GideonMax 任何非初学者都知道,CodeTreePart part=CodeTreePart::CodeTreePart(str); 不是一个任务(我不知道你想用那个例子说明什么)。而且你无法通过研究生成的代码来确定语言语义。

标签: c++ typedef


【解决方案1】:

typedef 不是一个新类型,它只是创建一个别名,你的Expression 仍然是std::function&lt;uint64_t(uint64_t)&gt; 类型。

我看不出这根本不可能的任何原因,因为构造函数只是具有它们构造的类的返回类型的函数。

这并不是根本不可能的(从某种意义上说,规范不允许这样的事情),但是规范中没有给出这样的功能,所以你不能这样做。就像不可能向现有类型添加新成员函数一样。

【讨论】:

    【解决方案2】:

    您的表达式可以是从std::function&lt;uint64_t(uint64_t)&gt; 派生的类,而不是typedef。然后你可以定义它的constructor(s)destructor,并把它称为std::function

    struct Expression : public std::function<uint64_t(uint64_t)>
    {
        Expression(std::string Expr, MicroCodeDescriptor* descriptor)
        {
    
        }
    };
    
    Expression e = Expression("", nullptr);
    uint64_t res = e(123);
    

    或者更好地使其成为模板:

    template<typename R = uint64_t, typename T = uint64_t>
    struct Expression : public std::function<R(T)>
    ...
    

    【讨论】:

    • 是的,我决定选择那个选项,尽管我绝对没有理由在这里使用模板
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-10
    • 1970-01-01
    • 2018-04-29
    相关资源
    最近更新 更多