Click here to Skip to main content
11,630,144 members (76,851 online)
Click here to Skip to main content

Tagged as

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

, 5 Feb 2012 CPOL 30K 4
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)

Share

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).

You may also be interested in...

Comments and Discussions

 
GeneralThanks for reply. 1.You are right about virtual methods. No... Pin
geoyar10-Feb-12 8:30
membergeoyar10-Feb-12 8:30 
General1. You do not want to use run time type info (dynamic_cast),... Pin
geoyar9-Feb-12 15:39
membergeoyar9-Feb-12 15:39 
GeneralRe: 1. RTTI has nothing to do with virtual methods. 2. It's just... Pin
Sebastian Krysmanski9-Feb-12 22:37
memberSebastian Krysmanski9-Feb-12 22:37 
GeneralI should have written that this is supposed to be a very fas... Pin
Sebastian Krysmanski7-Feb-12 21:09
memberSebastian Krysmanski7-Feb-12 21:09 
GeneralAs the tip is currently written, the ChildClass<T>::equals m... Pin
Doc Lobster7-Feb-12 5:11
memberDoc Lobster7-Feb-12 5:11 
GeneralNone of your functions are const (and equals() and Id() defi... Pin
Dominic Amann7-Feb-12 3:11
memberDominic Amann7-Feb-12 3:11 
Generalmartin, geoyar, xryl669 are perfectly correct. This is not g... Pin
Lakamraju Raghuram6-Feb-12 22:48
memberLakamraju Raghuram6-Feb-12 22:48 
GeneralYou're reinventing typeid typeof and the rest, but worst, yo... Pin
xryl6695-Feb-12 22:42
memberxryl6695-Feb-12 22:42 
GeneralReason for my vote of 5 Good one,my 5. Boost meta programmin... Pin
Ashish Tyagi 4030-Jan-12 16:14
memberAshish Tyagi 4030-Jan-12 16:14 
GeneralI do not think it is safe and good. All code is based on ass... Pin
geoyar30-Jan-12 15:47
membergeoyar30-Jan-12 15:47 
GeneralAs a matter of fact, it doesn't work across DLL boundaries. ... Pin
martin_bisson30-Jan-12 10:38
membermartin_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 | Terms of Use | Mobile
Web03 | 2.8.150723.1 | Last Updated 5 Feb 2012
Article Copyright 2012 by Sebastian Krysmanski
Everything else Copyright © CodeProject, 1999-2015
Layout: fixed | fluid