Click here to Skip to main content
Click here to Skip to main content

AGM::LibReflection: A reflection library for C++.

, 1 Nov 2004
Rate this:
Please Sign up or sign in to vote.
Description of the library AGM::LibReflection.

Introduction

LibReflection is a little library (well, a header to be specific) that gives reflection capabilities to C++ classes. When we talk about reflection, we don't mean just RTTI, but a rich palette of capabilities useful in every day programming:

  • specify and examine class inheritance
  • declare and examine normal and static fields
  • declare and examine normal, virtual, and static methods
  • declare and use properties and events
  • set and get field values
  • call methods and get results
  • create instances without having the headers at hand, by using a class registry

And all the above almost happen automatically, with very few macros that the programmer has to put in the application's classes...and you also get the added benefit of class properties and events, something that C++ does not provide by default.

Demo

Using LibReflection is very easy. The following piece of code shows a class with fields, properties and methods, all reflected in the class' Class object:

//what you need to include
#include "reflection.hpp"


//namespace usage
using namespace agm::reflection;


//example base class
class Base {
public:
    //needed so as that the class gets reflection capabilities
    CLASS(Base, NullClass);

    //a reflected property
    PROPERTY(int, length);

    //a reflected method
    METHOD(public, bool, processLength, (int l));

private:
    //a reflected field
    FIELD(private, int, m_length);

    //property getter
    int get_length() const {
        return m_length;
    }

    //property setter
    void set_length(int l) {
        m_length = l;
    }
};


//a reflected method implementation
bool Base::processLength(int l)
{
    return l == m_length;
}


//a derived class
class Derived : public Base {
public:
    //derived reflected class
    CLASS(Derived, Base);
};


//for the demo
#include <iostream>
using namespace std;


int main()
{
    //a class instance
    Derived derived;

    //get the class of the Derived class
    const Class &derived_class = derived.getClass();

    //print the class name
    cout << derived_class.getName() << endl;

    //print the the m_length field
    const Field &length_field = derived_class.getField("m_length");
    cout << length_field.getType() << " " 
         << length_field.getName() << endl;

    //print the the length property
    const Property &length_prop = derived_class.getProperty("length");
    cout << length_prop.getType() << " " 
         << length_prop.getName() << endl;

    //print the 'processLength()' method
    const Method &process_length_method = 
                 derived_class.getMethod("processLength");
    cout << process_length_method.getType() << " "
         << process_length_method.getName()
         << process_length_method.getArgs()
         << endl;

    //set the length property
    cout << "using length property" << endl;
    length_prop.set(&derived, 10);
    int i;
    length_prop.get(i, &derived);
    cout << "length = " << i << endl;

    //calling the length method
    cout << "calling bool Base::processLength(int)" << endl;
    bool b;
    process_length_method.invoke(b, (Base *)&derived, 10);
    cout << "processLength=" << b << endl;

    getchar();
    return 0;
}

Documentation

For more information, you can check out my little site here.

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here

About the Author

Achilleas Margaritis
Software Developer (Senior)
Greece Greece
No Biography provided

Comments and Discussions

 
Generaltypeless parameters PinmemberMember 1811246-Oct-08 5:26 
GeneralWindows CE compilation PinmemberDuvidaCruel9-Feb-07 9:11 
GeneralLibReflection for gcc PinsussAnonymous3-May-05 4:51 
QuestionArrays? Pinmemberneo26007776-Apr-05 9:30 
GeneralAn Update Version Posted Pinmembermy203829-Mar-05 7:52 
GeneralNew Changes Made to LibReflection Pinmembermy203823-Mar-05 10:22 
GeneralRe: New Changes Made to LibReflection PinmemberWREY28-Mar-05 0:14 
GeneralRe: New Changes Made to LibReflection Pinmembermy203828-Mar-05 6:40 
GeneralNot totally true. PinmemberWREY28-Mar-05 8:23 
GeneralRe: Not totally true. Pinmembermy203829-Mar-05 7:53 
GeneralCompile Error in VS.NET 1.1 Pinmembercolormegjian22-Mar-05 3:26 
GeneralRe: Compile Error in VS.NET 1.1 Pinmembertomthorne22-Apr-05 7:23 
GeneralRe: Compile Error in VS.NET 1.1 Pinmemberderchoff6-Oct-05 0:15 
QuestionCan i use it in BCB? PinmemberFlameBlade17-Feb-05 2:41 
GeneralContact Pinsusspsyclonist (Stephan K.)22-Nov-04 1:41 
QuestionCan Instance be Created Dynamicly? PinmemberLaisser21-Nov-04 6:21 
GeneralVery Interesting! Pinmemberggerules10-Nov-04 5:19 
GeneralCool! PinmemberJim Crafton2-Nov-04 14:15 
GeneralRe: Cool! Pinmemberaxilmar3-Nov-04 2:37 
GeneralRe: Cool! Pinmembermy203815-Mar-05 10:27 
GeneralDude Pinmemberarmentage2-Nov-04 9:23 
GeneralRe: Dude Pinmemberaxilmar2-Nov-04 9:42 
GeneralRe: Dude PinmemberDave Handley3-Nov-04 6:10 
GeneralRe: Dude PinmemberAnders Dalvander13-Nov-04 2:03 
GeneralRe: Dude PinmemberDave Handley13-Nov-04 3:08 
"CFileDialog isn't really standard C++, it is a MFC class, and thus will only work in Microsoft Windows. But should't you use the Win32 function SHBrowseForFolder, and not derive from CFileDialog anyway?"
 
Unfortunately, even using SHBrowseForFolder isn't trivial in the .Net Framework - see http://www.netomatix.com/FolderBrowser.aspx
 
"I wouldn't state that standard C++ is clear, either."
 
ANSI Standard C++ is very clear in my opinion - much more so than many other languages. Especially given the amount of explicit control you have over data management.
 
"The CLR, CLI, C# and C++/CLI are standards, but you're stuck in .NET, that is true. But .NET is ported to other systems than Windows. See DotGnu and Mono."
 
C++/CLI is a standard but it still is NOT ANSI Standard C++ which makes it much less portable. .Net may be ported to a few other platforms, but it still isn't properly cross-platform.
 
"You are not working through an intermediate language, the JIT-compiler will create machine code. In C++/CLI you don't have to use garbage collection, you can use deterministic destruction instead."
 
As far as I know the only way to do deterministic destruction is with the IDisposable interface, and even then the Garbage Collector does some of the work so it isn't strictly fully deterministic. Also any form of Just in Time Compiler directly implies the existence of intermediate code - of course the IL is converted to machine code before it is used, but it is still converted and that takes time.
 
"Vertigo Software ported Quake 2 to .NET with a performance decrease of only 15%. And that was done in 5 days: 4 days for porting from C to C++ and one day to port to Managed C++."
 
Unfortunately, something like Quake 2 isn't really a good example of a performance intensive application. From what I remember Quake 2 was written to run on a Pentium 133, and as with many games most of the really performance intensive stuff is done inside the OpenGL library down on the Graphics Card. That will still be the same in a managed port. When someone gets a ray-tracer working in managed code with similar performance to native C++ I'll be impressed, but I can't see it happening. Given that most of the really intensive stuff in Quake 2 is happening down on the graphics card, a 15% performance drop is huge.
 
Dave
GeneralRe: Dude Pinmemberkim-ryo11-Jan-05 13:30 
GeneralRe: Dude PinmemberDave Handley11-Jan-05 20:40 
GeneralRe: Dude PinsussAnonymous17-Oct-05 6:52 
AnswerRe: Dude PinmemberRetroBooster211-Dec-07 0:35 
GeneralMore documentation. Please! PinmemberJohn M. Drescher2-Nov-04 5:57 
GeneralRe: More documentation. Please! Pinmemberaxilmar2-Nov-04 6:44 
GeneralRe: More documentation. Please! PinmemberJohn M. Drescher2-Nov-04 7:39 
GeneralRe: More documentation. Here! PinsussArno Nym2-Nov-04 8:55 
GeneralRe: More documentation. Please! PinmemberJim Crafton2-Nov-04 14:14 
GeneralRe: More documentation. Please! PinmemberJohn M. Drescher11-Nov-04 5:34 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

| Advertise | Privacy | Mobile
Web03 | 2.8.140721.1 | Last Updated 2 Nov 2004
Article Copyright 2004 by Achilleas Margaritis
Everything else Copyright © CodeProject, 1999-2014
Terms of Service
Layout: fixed | fluid