А есть способ превратить параметр темплейта в строку?
Как в дефайнах делается:
#define string(x) #x
Нужен аналог для темплейтов, типа:
template<class T>
class MyClass
{
public:
const char* GetParameterName() const { return #T; }
}
Есть там что нибудь? Пытался в гугле поискать, но он столько мусору вываливает, что совершенно невозможно.
Вопрос по C++
Правила форума
Пожалуйста, ознакомьтесь с правилами данного форума
Пожалуйста, ознакомьтесь с правилами данного форума
- aissp
- Маньяк
- Сообщения: 2710
- Зарегистрирован: 07 ноя 2005, 09:51
Строгий ответ - нет. Аналога нет. ты можешь воспользоваться typeinfo но ето видимо не то что тебе надо + накладные расходы, да и более того компиляторы не гарантируют что имя полученное посредством тайпинфо буде ожидаемым для тебя. Но, предположу, что раз ьебя дефине не устраивает чем-то, тебе нужно что-то другое. Что именно?
-
- Частый Гость
- Сообщения: 41
- Зарегистрирован: 08 май 2006, 17:20
Как вариант, можно использовать такие костыли (препроцессор, но по-другому, имхо, никак):
template<class T>
class MyClass
{
std::string _name;
public:
MyClass(std::string name = "") : _name(name) {}
const char* GetParameterName() const { return _name.c_str(); }
};
#define declare(C, T, v) C<T> v(#T)
int main()
{
declare(MyClass, int, m);
std::cout << m.GetParameterName() << std::endl;
return 0;
}
template<class T>
class MyClass
{
std::string _name;
public:
MyClass(std::string name = "") : _name(name) {}
const char* GetParameterName() const { return _name.c_str(); }
};
#define declare(C, T, v) C<T> v(#T)
int main()
{
declare(MyClass, int, m);
std::cout << m.GetParameterName() << std::endl;
return 0;
}
- sz
- Маньяк
- Сообщения: 1266
- Зарегистрирован: 17 фев 2003, 19:34
Спасибо. В общем, похоже, кроме tipeof, вариантов нет.
Прискорбно, потому что у нас rtti в проекте отключен. Изменить настройки билда у меня нет возможности.
Придется решать через виртуальные функции. Подробности примерно такие:
template<class T>
class Base
{
static int SomeClassSpecificVar;
virtual void OverrideMe()
{
ASSERT( false, "OverrideMe is not overriden" );
}
};
class Derived1 : public Base<Derived1>
{
void OverrideMe() { printf( "Derived1\n" ); }
}
В общем, там большое количество наследников, которые составляют дерево, и у них эта виртуальная функция вызывается рекурсивно. В общем, у меня вылетает assert, а кто это, собственно, не имплементировал - это вопрос вопросов.
При этом все осложняется тем, что есть классы которые и не должны ее имплементировать, потому что в это дерево им не положено.
Передизайнить этот бардак я тоже не имею права - меня в этот проект помогать прислали, а не переделывать все. Придется дебагером допрыгивать до точки. А это долго. Не говоря уже о том, что дебагеры хуже, чем у ps3, конечно, бывают, но мне не встречались. Редкий глюкодром, который, кроме всего прочего, иногда задумывается на десяток секунд при простой команде step.
Можно, конечно, пройти по всей иерархии и добавить виртуальную GetClassName. Но я не уверен, что это будет быстрее, чем протрейсить.
Ладно, запасемся терпением.
Прискорбно, потому что у нас rtti в проекте отключен. Изменить настройки билда у меня нет возможности.
Придется решать через виртуальные функции. Подробности примерно такие:
template<class T>
class Base
{
static int SomeClassSpecificVar;
virtual void OverrideMe()
{
ASSERT( false, "OverrideMe is not overriden" );
}
};
class Derived1 : public Base<Derived1>
{
void OverrideMe() { printf( "Derived1\n" ); }
}
В общем, там большое количество наследников, которые составляют дерево, и у них эта виртуальная функция вызывается рекурсивно. В общем, у меня вылетает assert, а кто это, собственно, не имплементировал - это вопрос вопросов.
При этом все осложняется тем, что есть классы которые и не должны ее имплементировать, потому что в это дерево им не положено.
Передизайнить этот бардак я тоже не имею права - меня в этот проект помогать прислали, а не переделывать все. Придется дебагером допрыгивать до точки. А это долго. Не говоря уже о том, что дебагеры хуже, чем у ps3, конечно, бывают, но мне не встречались. Редкий глюкодром, который, кроме всего прочего, иногда задумывается на десяток секунд при простой команде step.
Можно, конечно, пройти по всей иерархии и добавить виртуальную GetClassName. Но я не уверен, что это будет быстрее, чем протрейсить.
Ладно, запасемся терпением.
- aissp
- Маньяк
- Сообщения: 2710
- Зарегистрирован: 07 ноя 2005, 09:51
Я все таки не понял проблемы. Правильно ли я понимаю? Существует большое количество наследников от класса Base в котором имплементирована функция func
Некоторые наследники должны перегружать ее а некоторые нет, причем те наследники которые не перегружают ее не должны ее и вызывать. Проблема состоит в том чтобы найти наследника который вызывает именно ету функцию (не пергрузил ее собака) но неохота ковыряться в коде а также не пользуюся макросами __file and __line
Так? Ты просто дал решение без задачи
Некоторые наследники должны перегружать ее а некоторые нет, причем те наследники которые не перегружают ее не должны ее и вызывать. Проблема состоит в том чтобы найти наследника который вызывает именно ету функцию (не пергрузил ее собака) но неохота ковыряться в коде а также не пользуюся макросами __file and __line
Так? Ты просто дал решение без задачи

- sz
- Маньяк
- Сообщения: 1266
- Зарегистрирован: 17 фев 2003, 19:34
- ajkj3em
- Маньяк
- Сообщения: 2063
- Зарегистрирован: 12 ноя 2006, 06:53