用户操作
[即时聊天] [发私信] [加为好友]
雷鹏ID:whinah
20347次访问,排名5852好友2人,关注者6
嵌入式两年,安全两年,现今搜索
whinah的文章
原创 43 篇
翻译 0 篇
转载 0 篇
评论 13 篇
最近评论
whinah:客气、客气,这个RPC之后我也再没继续深入。打造一个稳定而强大的基础设施需要太大的精力。目前我们使用ICE,有兴趣可以去关心一下。前不久我在boost sandbox 中看到了一个rpc,没细看,估计在参数传递方面和我的设计思想差不多,不过它底层用的是boost.asio。
zm0011:在开发网络通讯程序中很有用,正想自己写一个,竟然百度出来了。顺便看了一下老兄的其它文章,数量不多但水平比较高,而且涉足的领域很多哦,从WIN到LINUX、从C++壳到数据库都有。希望能看到你奉献更多的好东东,谢谢!
whinah:这里只考虑了简单性,atl 这种手工打造虚表的方法的确可以节省存储空间,但是繁琐了一些。
nico:有没有考虑过 ATL/WTL 里用到模拟虚函数?

template <class T>
class foo
{
int& get_n()
{
T* pT = (T*)this;
return pT->n;
}
}

class bar : foo<……
whinah:如果真要实际使用这种技术,字符串文字量也必须经过地址转换,如:
convert_address("string literal")
文章分类
    收藏
      相册
      我的相册
      存档
      软件项目交易
      订阅我的博客
      XML聚合  FeedSky
      订阅到鲜果
      订阅到Google
      订阅到抓虾
      订阅到BlogLines
      订阅到Yahoo
      订阅到GouGou
      订阅到飞鸽
      订阅到Rojo
      订阅到newsgator
      订阅到netvibes

      原创 Comparator 将 M×N 转化成 M+N收藏

      新一篇: 一个很强大的Comparator生成器 | 旧一篇: C++ 中 Bool functor 的优化

      用C++写程序经常需要写一些很小的functor,最常见的例子就是 compare functor,排序的,查找的,自己每定义一个数据结构,就要定义一个 compare functor,甚至多个(对不同字段)。甚至,针对指针的,智能指针的……的compare,这件工作很繁琐,很容易使人厌倦。

      举个例子,同一个数据结构有M个字段,这些字段有P种类型,还有有N种不同的访问方式(直接提取、通过指针、通过智能指针、甚至通过反序列化等等),要实现所有这些情况的查找/排序,就需要 M×N 个 compare functor 的定义!

      从 boost::multi_index 中学到一点,将 KeyExtractor 和 Comparator 分离,这样,只需要写 P 个Comparator,M+N个KeyExtractor,一般情况下,甚至不需要写Comparator,因为字段类型大多是内建类型,Comparator是默认的。举个例子吧:

      using namespace std;

      using boost::shared_ptr;

      //using boost::intrusive_ptr;

       

      struct mydata

      {

         int d1, d2, d3, d4, d5;

         string s1, s2, s3;

      };

       

      struct mydata_get_int

      {

         int offset;

       

         mydata_get_int(int offset) : offset(offset) {}

       

         int operator()(const mydata& x) const

         {

            return *(int*)(offset + (unsigned char*)&x);

         }

         // 假定T 就是mydata* 或者智能指针

         template<class T>

         int operator()(const T& x) const

         {

            return *(int*)(offset + (unsigned char*)&(*x));

         }

      };

      struct mydata_get_str

      {

         int offset;

       

         mydata_get_str(int offset) : offset(offset) {}

       

         const string& operator()(const mydata& x) const

         {

            return *(string*)(offset + (unsigned char*)&x);

         }

         // 假定T 就是mydata* 或者智能指针

         template<class T>

         const string& operator()(const T& x) const

         {

            return *(string*)(offset + (unsigned char*)&(*x));

         }

      };

       

       

       

      class ExtractCompare

      {

         KeyExtractor m_extractor;

         KeyCompare   m_comp;

       

      public:

         ExtractCompare(const KeyExtractor& ext = KeyExtractor(),

                      const KeyCompare& comp = KeyCompare())

            : m_extractor(ext), m_comp(comp) {}

       

         template<class T1, class T2>

         bool operator()(const T1& t1, const T2& t2) const

         {

            return m_comp(m_extractor(t1), m_extractor(t2));

         }

      };

      template<class KeyExtractor, class KeyCompare>
      ExtractCompare<KeyExtractor, KeyCompare>
      make_ec(const KeyExtractor& kex, const KeyCompare& comp)
      {
         return ExtractCompare<KeyExtractor, KeyCompare>(kex, comp);
      }
       

       

      int main(int argc, char* argv[])

      {

         vector<mydata> v1;

         vector<mydata*> v2;

         vector<shared_ptr<mydata> > v3;

         //vector<intrusive_ptr<mydata> > v4;

       

         // .... fill some data to v1, v2, v3

       

         sort(v1.begin(), v1.end(), make_ec(mydata_get_int(FIELD_OFFSET(mydata, d1)), less<int>()));

         sort(v2.begin(), v2.end(), make_ec(mydata_get_int(FIELD_OFFSET(mydata, d2)), less<int>()));

         sort(v1.begin(), v1.end(), make_ec(mydata_get_int(FIELD_OFFSET(mydata, d3)), less<int>()));

        

         sort(v3.begin(), v3.end(), make_ec(mydata_get_str(FIELD_OFFSET(mydata, s3)), less<string>()));

       

         return 0;

      }

       

      其中的ExtractCompare和make_ec可以作为公用代码,在多个程序中使用。

      使用FIELD_OFFSET,在不降低效率的前提下,避免了代码膨胀。当然,这个例子中因为vector元素类型不同,会生成sort的3个不同版本,但是,如果不使用FIELD_OFFSET,而是直接再写一个extractor,这里会生成sort的4个版本。当然,一般情况下,不会像这样同时使用三个不同类型的vector。

      C++0X 问世以后,其中的closure功能或许会使得这种方法显得过时,但是在没有closure的当前编译器上,这种方法还是很实用的。

      发表于 @ 2008年04月22日 14:54:00|评论(loading...)|编辑

      新一篇: 一个很强大的Comparator生成器 | 旧一篇: C++ 中 Bool functor 的优化

      评论:没有评论。

      发表评论  


      当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
      Csdn Blog version 3.1a
      Copyright © whinah