Как получить имя класса? - PullRequest
       33

Как получить имя класса?

12 голосов
/ 17 декабря 2010

Если я определил класс:

class Blah {};

Как я могу:

std::string const className = /* What do I need to do here? */;
assert( className == "Blah" );

Не думаю, что typeid (). Name () - хорошая идея, так как реализация компилятора специфична.Что-нибудь предусмотрено стандартом C ++ или Boost?

Примечание: Если класс был унаследован от QObject Qt, я мог бы легко использовать QMetaObject::className() для получения имени класса.

Ответы [ 6 ]

10 голосов
/ 17 декабря 2010

Как это:

class Blah { static std::string const className() { return "Blah"; }};

std::string const name = Blah::className();
assert(name == "Blah");

Или это:

class Blah {};

template < typename T > struct name;
template < > struct name<Blah> { static std::string value() { return "Blah"; }};

std::string const classname = name<Blah>::value();
assert(classname == "Blah");

навороченные:

#define DECLARE_NAMED_CLASS( Name ) \
struct Name;\
template < > struct name<Name> { static std::string value() { return #Name; }};\
struct Name

DECLARE_NAMED_CLASS(Blah) {};
std::string const className = name<Blah>::value();
...

Или это:

class Blah : QObject { Q_OBJECT };

Или это: ... Или это: ...

3 голосов
/ 17 декабря 2010

Тестирование класса, глядя на его имя, звучит ужасно как подход в стиле Java для меня, и в C ++ вы должны быть осторожны, пытаясь применить те же шаблоны! Лучше было бы использовать что-то вроде boost::type_traits и может быть is_same с реальным именем класса.

1 голос
/ 10 ноября 2011

Метод QObject-> metaObject () действителен для Qt, за исключением классов на основе QGraphicsItem, которые не наследуются от QObject ...

1 голос
/ 17 декабря 2010

Я не думаю, что typeid (). Name () - хорошая идея, поскольку она зависит от реализации компилятора.

Да, стандарт не требует от реализации использования какого-либо конкретного именования,поэтому он может измениться даже для одного и того же компилятора.

Есть ли что-нибудь, предусмотренное стандартом C ++ или Boost?

Нет стандартных средств, которые бы возвращали имя класса вкакая-то каноническая форма.

1 голос
/ 17 декабря 2010

Я думаю dynamic_cast может быть тем, что вы ищете.Он не дает вам имя класса, но дает сбой так, как вы бы хотели, чтобы ваше утверждение провалилось, за исключением того, что подклассы Blah не будут перехвачены.

1 голос
/ 17 декабря 2010

Я не думаю, что есть какое-то некомпетентное решение для такой проблемы, которое не включает в себя множество макросов в объявлении класса (на самом деле, если я правильно понял документацию QT, строка, которую вы получаете с objectName, фактически назначена "от руки ", я думаю, с кодом, созданным moc).

С другой стороны, вообще, чтобы проверить, является ли класс объекта тем, который вам не нужен, вы не должны делать строкусравнение, но вместо этого сделайте сравнение typeid.

assert(typeid(YourObject)==typeid(Blah));

Но, вероятно, вам лучше объяснить, чего вы пытаетесь достичь.

...