【问题标题】:C++11 auto transformC++11 自动变换
【发布时间】:2016-04-09 00:32:53
【问题描述】:

我有这个宏

#define DO_ALL_BLEND_INFO(iter) for (iter=s_blend_info.begin(); iter!=s_blend_info.end(); ++iter)

这是主要功能..

BLEND_ITEM_INFO* blend_info;
T_BLEND_ITEM_INFO::iterator iter;

DO_ALL_BLEND_INFO (iter)
{
    blend_info = *iter;
    if (blend_info->item_vnum == item->GetVnum())
    {

    }
}

我想做的是摆脱这个宏并使用 auto. 但是我不明白如何在这里使用 auto... 我想删除那个宏,但是如果我直接在宏中添加 auto 呢?

【问题讨论】:

    标签: c++ c++11 macros


    【解决方案1】:

    以下,仅此而已:

    for (const auto &blend_info:s_blend_info)
    {
        if (blend_info->item_vnum == item->GetVnum())
        {
    
        }
    }
    

    我的意思是,除此之外“没有别的”。没有宏,没有任何迭代的声明。没有blend_info 的声明,auto 范围迭代会为您完成。

    【讨论】:

    • 为什么是 const?为什么 & ?这还不够吗?对于(自动混合信息:s_blend_info)
    • 黄金法则:除非您打算修改某些内容,否则请明确声明 const。您正在帮助编译器优化您的代码,并防止自己产生无意的错误。并且使用引用可以避免制作冗余副本。与经验丰富的 C++ 程序员编写 void foo(const std::vector<int> &param); 而不是 void foo(std::vector<int> param); 的原因相同
    • 感谢@Sam Varshavchik 的解释
    【解决方案2】:

    这是另一种方法。我修改代码并将s_blend_info替换为vector<int>以获得可编译的解决方案。

     int main()
     {
    vector<int> s_blend_info;
    int  blend_info;
    vector<int>::iterator iter;
    int item = 10;
    for (auto iter = s_blend_info.begin(); iter != s_blend_info.end(); ++iter)
    {
        blend_info = *iter;
        if (blend_info == item)
        {
    
        }
    }
    for ( auto &iter  : s_blend_info)
    {
        if (blend_info == item)
        {
    
        }
    }
    DO_ALL_BLEND_INFO_GENERIC(s_blend_info, iter)
    {
        blend_info = *iter;
        if (blend_info == item)
        {
    
        }
    }
    }
    
    #define DO_ALL_BLEND_INFO(iter) for (iter=s_blend_info.begin(); iter!=s_blend_info.end(); ++iter)
    #define DO_ALL_BLEND_INFO_GENERIC(container,iterator)  for (iterator=container.begin(); iterator!=container.end(); ++iterator)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-11
      • 2012-08-08
      • 1970-01-01
      相关资源
      最近更新 更多