分享

一段用C++ template技术实现类似Java反射机制的代码

 quasiceo 2013-02-22
楼主 发表于: 2004-04-20 12:15:55
//File: class.h

#ifndef __CLASS_H__
#define __CLASS_H__

#include <string>
#include <map>

typedef void* (*FactoryMethod)(void);
class Registry;

/*
 * 这个类是用来存储<name, create object function>对,
 * 也就是个对象工厂.
 */
class Class
{
public:
    static Class forName(std::string name)
    {
        return Class(name);
    }
    
public:
    void* newInstance(void)
    {
        std::map<std::string, FactoryMethod>::const_iterator find;
        find = registry.find(name);
        if (find == registry.end())
            return NULL;
        else
            return (find->second)();
    }
    
private:
    friend class Registry;
    static bool registerClass(std::string name, FactoryMethod method)
    {
        return registry.insert(std::make_pair(name, method)).second;
    }
    
private:
    static std::map<std::string, FactoryMethod> registry;    
    std::string name;
    
    explicit Class(std::string n) : name(n)
    {}
};

std::map<std::string, FactoryMethod> Class::registry;


class Registry
{
public:
    Registry(const char* name, FactoryMethod method)
    {
        Class::registerClass(name, method);
    }
};

/*
 *  mixed template, generate new instance for every class.
 */
template <class T, const char name[]>
class Registed
{
public:
    static void* newInstance(void)
    {
        return new T();
    }
    
protected:
    Registed()
    {
        const Registry& dummy = r;
    }    
    
private:
    static const Registry r;
};

/* 
 * static member, initiliazed before enter into main() 
 * call Class::registerClass by ctor of Registry
 */
template <class T, const char name[]> const Registry
Registed<T, name>::r = Registry(name, Registed<T, name>::newInstance);



#define REG_CLASS(CLASS) \
char NameArray[] = #CLASS; \
class CLASS : public Registed<CLASS, NameArray> \



#endif // __CLASS_H__



// Class.cc
#include <iostream>
#include "Class.h"


REG_CLASS(Test)
{
public:
    Test() { std::cout << "Test" << std::endl; }
};


int main(int argc, char* argv[])
{
    Class c = Class::forName("Test");
    void* p = c.newInstance();
    system("pause");
    return 0;
}


编译环境: DEV C++, windows 2000 server.
运行结果: Test

让我奇怪的是模板类Registed中的protected构造器,
他到底起什么作用? 如果把这个构造器去掉,编译能够通过,
但运行没有结果,原因是Registed中的static member没有初始化,
从而Registry的构造器没有运行..





    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多