代码之家  ›  专栏  ›  技术社区  ›  k06a

自制汽车模板(不使用C++ 0x)

  •  8
  • k06a  · 技术社区  · 15 年前

    汽车

    for(std::deque<std::pair<int, int> >::iterator it = points.begin();
        it != points.end(); ++it)
    {
       ...
    }
    

    可能是这样的班级:

    class AUTO
    {
    public:
       template <typename T1>
       AUTO(T1);
    
       template <typename T2>
       operator T2();
    };
    

    使用这种用法:

    for(AUTO it = points.begin(); it != points.end(); ++it)
    {
       ...
    }
    

    但是,T1和T2是不同的。 如何将T1的信息移动到 运算符T2() 真的有可能吗?

    4 回复  |  直到 13 年前
        1
  •  12
  •   dirkgently    15 年前

    如果库扩展很容易实现,那么就不需要语言扩展了。看到了吗 N1607

    然而 article Boost.Foreach (哪种类型是您想要的)宏可能有助于理解与此类实现相关的问题。

    什么是助推器?

    在C++中,编写迭代的循环。 在一个序列上是乏味的。我们可以 或者使用迭代器,这需要 相当多的锅炉板, 或者我们可以使用std::for \u each() 算法并将循环体移动到 锅炉板迫使我们移动 逻辑与它的用途相去甚远。 相比之下,其他一些语言, 像Perl一样,提供一个专用的 自动化的“foreach”结构 这样的C++构造。它迭代 为了我们,把我们从 或者写谓词。

    BOOST\u FOREACH设计用于 易用性和效率。它没有 函数调用或通过 函数指针,并且不进行调用 对公众来说是不透明的 编译器的优化器。这会导致 BOOST-u-FOREACH的性能是 通常在 等效的手工编码回路。以及 尽管BOOST\u FOREACH是一个宏,但它 是一个非常好的表现。它 不会让人感到意外。

        2
  •  10
  •   Kornel Kisielewicz    15 年前

    有一个 BOOST_AUTO 宏,或多或少做什么自动关键字。。。然而,一看它的实现将告诉你最好找到一种使用C++ 0x:& gt的方法。

        3
  •  3
  •   Johannes Schaub - litb    15 年前

    您可以使用这些宏以标准一致的方式解决这个问题。

    #define DEF_DED(D, E) any_base const & D = make_any_concrete((E))
    #define DED(D, E) get_t(D, true ? ded_ty() : get_idt((E)))
    
    template<typename T> struct id {
      typedef T type;
    };
    
    template<typename T>
    id<T> get_idt(T t) { return id<T>(); }
    
    struct any_base { };
    
    template<typename D>
    struct any_concrete : any_base {
      any_concrete(D d):d(d) {}
      mutable D d;
    };
    
    template<typename T>
    any_concrete<T> make_any_concrete(T x) { return any_concrete<T>(x); }
    
    struct ded_ty {
      template<typename T>
      operator id<T>() { return id<T>(); }
    };
    
    template<typename T>
    T &get_t(any_base const &b, id<T>) { return static_cast<any_concrete<T> const&>(b).d; }
    

    所以你的for循环变成

    for(DEF_DED(it, points.begin()); 
        DED(it, points.begin()) != points.end(); 
      ++DED(it, points.begin()))
    {
       ...
    }
    

    功劳归于 Conditional Love: FOREACH Redux ,作者:埃里克·尼布勒。不确定这是否真的值得:)

        4
  •  2
  •   Potatoswatter    15 年前

    class AUTO
    {
    public:
       template <typename T1>
       AUTO(T1);
    
       T1 state; // eg deque<...>::iterator - need this!
    };
    

    这显然不会发生因为 AUTO

    鉴于 typeof decltype ,不过也没那么难。

    #define AUTO( name, initializer ) typeof( initializer ) name = initializer
    

    当然,这有很多限制。以及 类型 不是标准的。有了多个编译器支持,这可能是那些Boost工具的基础。