Is there a way to determine at runtime if an object can use a method in C ++?

Perl has a UNIVERSAL :: can method that you can call on any class or object to determine if it can do something:

sub FooBar::foo {}
print "Yup!\n" if FooBar->can('foo'); #prints "Yup!"

      

Let's say I have a base class pointer in C ++ that can be any of several different derived classes, is there an easy way to do something similar to this? I don't want to touch anything in the other derived classes, I can only change the scope in the base class that calls the function and one derived class that supports it.

EDIT: Wait, this is obvious now (no matter the question), I could just implement it in a base that returns a number representing UNIMPLEMENTED, then check that it is not when you call it. I'm not sure why I was thinking about things in such a complex way.

I also thought that I would extract my class from another one that I implemented foo

and then see if dynamic casting to that class works or not.

+2


source to share


4 answers


If you have a pointer or reference to a base class, you can use dynamic_cast

to find out which of its derived classes (and therefore which methods of its derivatives it supports).



+7


source


If you can add methods to the base class, you can add virtual bool can_foo() {return false;}

and override it in a subclass with foo to return true.



+5


source


C ++ doesn't have built-in runtime reflection. You are free to create your own reflection implementation in your class hierarchy. This usually includes a static map that is populated with a list of names and functions. You have to manually register each function you want and have consistency regarding the calling convention and function signature.

+3


source


I believe the most correct way would be to use the typeid <> operator and get a reference to the type_info object, and then you could compare that (== operator) to the desired type_info for the datatypes you want to care about.

This doesn't give you method-level validation and requires you to build with RTTI enabled (I believe using typeid <> for an object that was instantiated without RTTI results, with "undefined" behavior), but you're there.

MSDN has an online link to get you started: http://msdn.microsoft.com/en-us/library/b2ay8610%28VS.80%29.aspx

+2


source







All Articles