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

使用宏专门化std::swap可以吗?

  •  2
  • rlbond  · 技术社区  · 17 年前

    所以,我有一个宏。

    // swap_specialize.hpp
    #include <algorithm>
    
    #ifndef STD_SWAP_SPECIALIZE
    #define STD_SWAP_SPECIALIZE( CLASSNAME )            \
        namespace std {                                 \
        template<> inline                               \
        void swap( CLASSNAME & lhs, CLASSNAME & rhs )   \
        { lhs.swap(rhs); } }
    #endif
    

    // c.hpp
    #include <vector>
    #include "swap_specialize.hpp"
    class C
    {
        public:
            C();
    
            void swap(C& rhs)
            {
                data_.swap(rhs.data_);
            }
            C& operator=(C rhs)
            {
                rhs.swap(*this);
                return *this;
            }
        private:
            std::vector<int> data_;
    }
    
    STD_SWAP_SPECIALIZE(C)
    

    使用宏以这种方式专门化std::swap是否遵循编码约定?

    3 回复  |  直到 7 年前
        1
  •  6
  •   Johannes Schaub - litb    17 年前

    我想说,如果它增加可读性就可以了。判断你自己。只有我的两分钱:专业化 std::swap

    my_stuff::C c, b;
    // ...
    swap(c, b);
    // ...
    

    交换 如果你还没做完 using std::swap C 的命名空间:

    void swap(C &a, C &b) {
      a.swap(b);
    }
    

    using std::swap;
    swap(a, b);
    

    无论类型如何,这都将使用最佳匹配交换,并返回到 交换 如果在的命名空间中没有更好的匹配项 a . 硬编码调用 交换 将在不专门化的类型上缩短时间 交换

    这在另一方面是优越的:想象一下 C 交换

    template<typename T>
    void swap(C<T> &a, C<T> &b) {
      a.swap(b);
    }
    

    这就是交换的方式 std::string

        2
  •  0
  •   Pavel Minaev    17 年前

    我不认为这能给你带来多少好处。对于非模板类,它可以节省很少的行。对于模板类,当您想要专门化一般(即所有 T ),它就是不起作用。

        3
  •  0
  •   DaveR    17 年前

    STD_SWAP_SPECIALIZE() 对于其他一些类别,我认为这是完全合理的。毕竟,有一系列的

    STD_SWAP_SPECIALIZE(Foo)
    STD_SWAP_SPECIALIZE(Bar)
    STD_SWAP_SPECIALIZE(Baz)
    

    STD_SWAP_SPECIALIZE 稍大一点,则宏定义会在需要更改时在单个位置为您提供代码。(因为在您的示例中,模板定义非常小,所以这可能是一个没有实际意义的问题)。