KnowledgeHub
Questions
Tags
Users
Search
Alex Rivera
|
Logout
Edit Question
Title
Body
I would like to determine at compile time if a pointer to Derived can be cast from a pointer to Base without dynamic_cast<>. Is this possible using templates and metaprogramming? This isn't exactly the same problem as determining if Base is a virtual base class of Derived, because Base could be the super class of a virtual base class of Derived. Thanks, Tim Update: I felt good about this method: #include <iostream> using namespace std; class Foo { }; class Bar : public Foo { }; class Baz : public virtual Foo { }; class Autre : public virtual Bar { }; typedef char Small; class Big { char dummy[2]; }; template<typename B, typename D> struct is_static_castable { const B* foo; char bar[1]; static Small test(char(*)[sizeof(static_cast<const D*>(foo)) == sizeof(const D*)]); static Big test(...); enum { value = (sizeof(test(&bar)) == sizeof(Small)) }; }; int main() { cout << "Foo -> Bar: " << is_static_castable<Foo, Bar>::value << "\n"; cout << "Foo -> Baz: " << is_static_castable<Foo, Baz>::value << "\n"; cout << "Foo -> Autre: " << is_static_castable<Foo, Autre>::value << "\n"; } But it doesn't work with gcc: multi-fun.cpp: In instantiation of ‘is_static_castable<Foo, Baz>’: multi-fun.cpp:38: instantiated from here multi-fun.cpp:29: error: cannot convert from base ‘Foo’ to derived type ‘Baz’ via virtual base ‘Foo’ multi-fun.cpp:29: error: array bound is not an integer constant multi-fun.cpp: In instantiation of ‘is_static_castable<Foo, Autre>’: multi-fun.cpp:39: instantiated from here multi-fun.cpp:29: error: cannot convert from base ‘Foo’ to derived type ‘Autre’ via virtual base ‘Bar’ multi-fun.cpp:29: error: array bound is not an integer constant Am I confused about what can be done with the sizeof() trick?
Tags (comma-separated)
Save Edits
Cancel