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

Quickly check whether C++ template instances have the same parameters

, 5 Feb 2012
Rate this:
Please Sign up or sign in to vote.
How to check whether two template instances of a C++ class have the same template parameters without using dynamic_cast

Imagine the following C++ class structure (code is reduced):

class BaseClass {
public:
  virtual bool equals(BaseClass* other) = 0;
};
 
template<T>
class ChildClass {
public:
  virtual bool equals(BaseClass* other) {
    // How to check whether this cast is ok?
    ChildClass<T> otherCast = static_cast<ChildClass<T>>(other);
  }
};

How to check whether the static_cast is valid? One way is to use dynamic_cast.

Here's an alternative if you don't want/can't use dynamic_cast, implemented through classID():

class BaseClass {
public:
  virtual bool equals(BaseClass* other) = 0;
  virtual int classID() const = 0;
};
 
template<class T>
class ChildClass {
public:
  virtual bool equals(BaseClass* other) {
    if (this->classID() != other->classID()) {
      return false;
    }
    ChildClass<T> otherCast = static_cast<ChildClass<T>>(other);
  }
 
  virtual int classID() const {
    static int id; 
    return (int)&id; // generates a custom "id"
  }
};

Each template instantiation of ChildClass will have another ID. So, for example, ChildClass<MyClass> will have another ID as ChildClass<MyOtherClass>. Using the same template parameter(s) will result in the same ID.

Note: Although I've tested this only with Visual C++ 2010, it seems logical that this will work with other compilers too. I haven't tested this across DLL boundaries.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

About the Author

Sebastian Krysmanski
Software Developer University of Stuttgart
Germany Germany
I have studied Software Engineering and am currently working at the University of Stuttgart, Germany.
 
I have been programming for many years and have a background in C++, C#, Java, Python and web languages (HTML, CSS, JavaScript).
Follow on   Twitter

Comments and Discussions

 
GeneralThanks for reply. 1.You are right about virtual methods. No... Pinmembergeoyar10-Feb-12 8:30 
General1. You do not want to use run time type info (dynamic_cast),... Pinmembergeoyar9-Feb-12 15:39 
GeneralRe: 1. RTTI has nothing to do with virtual methods. 2. It's just... PinmemberSebastian Krysmanski9-Feb-12 22:37 
GeneralI should have written that this is supposed to be a very fas... PinmemberSebastian Krysmanski7-Feb-12 21:09 
GeneralAs the tip is currently written, the ChildClass<T>::equals m... PinmemberDoc Lobster7-Feb-12 5:11 
GeneralNone of your functions are const (and equals() and Id() defi... PinmemberDominic Amann7-Feb-12 3:11 
Generalmartin, geoyar, xryl669 are perfectly correct. This is not g... PinmemberLakamraju Raghuram6-Feb-12 22:48 
GeneralYou're reinventing typeid typeof and the rest, but worst, yo... Pinmemberxryl6695-Feb-12 22:42 
GeneralReason for my vote of 5 Good one,my 5. Boost meta programmin... PinmemberAshish Tyagi 4030-Jan-12 16:14 
GeneralI do not think it is safe and good. All code is based on ass... Pinmembergeoyar30-Jan-12 15:47 
GeneralAs a matter of fact, it doesn't work across DLL boundaries. ... Pinmembermartin_bisson30-Jan-12 10:38 

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
Web04 | 2.8.140718.1 | Last Updated 5 Feb 2012
Article Copyright 2012 by Sebastian Krysmanski
Everything else Copyright © CodeProject, 1999-2014
Terms of Service
Layout: fixed | fluid