Вопрос по C++

Все, что вы хотели знать о программизме, но боялись спросить.
Ответить
Аватара пользователя
sz
Маньяк
Сообщения: 1266
Зарегистрирован: 17 фев 2003, 19:34

Вопрос по C++

Сообщение sz »

А есть способ превратить параметр темплейта в строку?
Как в дефайнах делается:

#define string(x) #x

Нужен аналог для темплейтов, типа:

template<class T>
class MyClass
{
public:
const char* GetParameterName() const { return #T; }
}

Есть там что нибудь? Пытался в гугле поискать, но он столько мусору вываливает, что совершенно невозможно.
Аватара пользователя
aissp
Маньяк
Сообщения: 2710
Зарегистрирован: 07 ноя 2005, 09:51

Сообщение aissp »

Строгий ответ - нет. Аналога нет. ты можешь воспользоваться typeinfo но ето видимо не то что тебе надо + накладные расходы, да и более того компиляторы не гарантируют что имя полученное посредством тайпинфо буде ожидаемым для тебя. Но, предположу, что раз ьебя дефине не устраивает чем-то, тебе нужно что-то другое. Что именно?
anton2
Частый Гость
Сообщения: 41
Зарегистрирован: 08 май 2006, 17:20

Сообщение anton2 »

Как вариант, можно использовать такие костыли (препроцессор, но по-другому, имхо, никак):

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

Сообщение sz »

Спасибо. В общем, похоже, кроме 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. Но я не уверен, что это будет быстрее, чем протрейсить.

Ладно, запасемся терпением.
Аватара пользователя
aissp
Маньяк
Сообщения: 2710
Зарегистрирован: 07 ноя 2005, 09:51

Сообщение aissp »

Я все таки не понял проблемы. Правильно ли я понимаю? Существует большое количество наследников от класса Base в котором имплементирована функция func

Некоторые наследники должны перегружать ее а некоторые нет, причем те наследники которые не перегружают ее не должны ее и вызывать. Проблема состоит в том чтобы найти наследника который вызывает именно ету функцию (не пергрузил ее собака) но неохота ковыряться в коде а также не пользуюся макросами __file and __line

Так? Ты просто дал решение без задачи :)
Аватара пользователя
sz
Маньяк
Сообщения: 1266
Зарегистрирован: 17 фев 2003, 19:34

Сообщение sz »

Да _file и _line - можно пользоваться. rtti нельзя.
Да ладно, наплюй, я ее уже нашел.
Аватара пользователя
ajkj3em
Маньяк
Сообщения: 2063
Зарегистрирован: 12 ноя 2006, 06:53

Сообщение ajkj3em »

Старина Зотин писал(а): virtual void OverrideMe()
{
ASSERT( false, "OverrideMe is not overriden" );
}
не проще ли ее сделать = 0;
Передизайнить этот бардак я тоже не имею права - меня в этот проект помогать прислали, а не переделывать все.
я улавливаю нотки сожаления ... :)
Ответить