【问题标题】:C++11 auto and void* genericsC++11 自动和 void* 泛型
【发布时间】:2018-03-11 12:57:12
【问题描述】:

基于this,我可以推断int age = 45; auto* page = &age; std::cout << *page; 将允许在c++ 中使用真正的泛型,而void* 需要知道类型才能转换它并获取值?

我再次学习 c++,并认为 auto* 将是 void* 的一个非常合适和理想的替代品。

【问题讨论】:

  • 为了回答这个问题,什么才是“真正的泛型”?
  • @rex 我暗示包括取消引用在内的操作可以在不考虑类型的情况下发生。据我了解,泛型推断该类型是泛型的、未知的且未跟踪。我认为void* 充其量是伪泛型。

标签: c++ c++11 void-pointers auto


【解决方案1】:

auto foo = GetFoo(); 并不是要替代void*auto'ed 变量具有非常具体的、编译时确定的类型。 auto 关键字的意思是说编译器“请为我推断对象类型”。事实上,你不能只声明一个auto 变量。您必须分配它,以便编译器可以知道它实际上是什么类型)

这对于模板化类型尤其有用,模板类型可能具有繁琐、冗长和丑陋的语法,但绝对不适用于泛型编程。

顺便说一句auto* 并没有真正添加任何简单的auto。在每种情况下,类型都由右侧的表达式给出。

auto* foo = nullptr;   // compile error: cannot determine type
void* vFoo = nullptr;  // OK, void* type variable
int bar = 5;           // declares int variable
auto pBar = &bar;      // compile-time determined type: int*
auto* pBar2 = &bar;    // same as pBar
vFoo = &bar;           // OK
double otherBar = 5.0; // declares double variable
pBar = &otherBar;      // compile error: wrong type 

【讨论】:

    【解决方案2】:

    我正在再次学习 c++,并认为 auto* 将是 void* 的非常合适和理想的替代品。

    不,这行不通。

    int i;
    auto* p1 = &i;
    double d;
    auto* p2 = &d;
    
    p1 = p2; // Won't work.
    

    尽管p1p2 是使用auto 关键字声明的,但这些对象的类型是不同的。它们分别是int*double*

    如果我们使用过

    void* p1 = &i;
    void* p2 = &d;
    

    以下就可以了。

    p1 = p2;
    

    核心语言级别不提供对泛型的支持。您必须使用 std::anyboost::any 来获得对泛型的支持。

    【讨论】:

    • 好点;那么为什么 auto 暗示泛型炒作如果它可以被分配一个类型,但在其生命周期内必须保持该类型?
    • @Mushy, auto 仅表示自动推断类型。我不确定是谁在制造你所说的炒作。
    • 阅读 Stroustrups 的 c++ 书我认为 auto 的最佳用途是避免使用长类型名称,但仍然必须知道 auto 使用什么类型,就像 void* 一样,所以我认为没有对他们中的任何一个都有普遍的优势。
    【解决方案3】:

    void* 有很多有用的应用,它丢弃所有类型信息,让你玩弄内存。而auto 在编译时推断类型信息。

    例如,你可以有一个void*的向量:

    // please don't do that unless you have good reason.
    std::vector<void*> vars;
    
    vars.push_back(new int);
    vars.push_back(new double);
    

    但这不适用于auto,因为它必须在编译时进行推断。即使推断出来,容器也会包含所有相同的类型:

    // An old concept syntax, rejected
    
    std::vector<auto*> vars = std::vector<int*>{};
    
    vars.push_back(new int);
    vars.push_back(new double); // error! double* is not int*!
    

    auto 是所有编译时间。 void* 丢弃所有编译时知识。所以auto 不是void* 的替代品,而是恰恰相反。

    【讨论】:

      猜你喜欢
      • 2023-03-16
      • 2012-08-16
      • 1970-01-01
      • 1970-01-01
      • 2013-04-19
      • 2010-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多