2014-01-15 3 views
15

Я предполагаю, что это невозможно, но что делать. Возможно ли каким-то образом получить тип охватывающего класса в статической функции-члене, в любой версии C++?C++ тип охватывающего класса в статической функции-члене

class Impossible { 
public: 
    static void Fun() 
    { 
     typedef Impossible EnclosingClass; 

     // now do something with EnclosingClass ... 
    } 
} 

Есть ли способ, чтобы получить тип объемлющего класса (Impossible в данном случае) без написания имени класса в функции?

Причина, по которой я хотел бы сделать это, заключается в том, чтобы избежать повторения имени класса в функции. Это может легко привести к трудно найти копировать-вставить ошибку, если что-то подобное произошло:

class SomeOther { // another class, with the same interface as Impossible 
public: 
    static void Fun() 
    { 
     typedef Impossible EnclosingClass; 
     // whoops, copy-pasted, forgot to change "Impossible" to "SomeOther" 

     // now do something with EnclosingClass ... 
    } 
} 

Есть хороший способ предотвратить такого рода вещи происходит? Я мог представить, что касался чего-то, что было объявлено частным в окружающем классе, но это заставило бы меня писать дополнительный код (поскольку мой текущий проект не содержит каких-либо неотъемлемых частных членов, все является общедоступным).

+4

+1 для того, чтобы сообщить нам * почему * вы хотите этого без необходимости выталкивать и подталкивать. –

+0

@jbgs Я не уверен, насколько я понимаю, как это поможет. Вы имеете в виду создание всего шаблона Fun()? Это заставит меня повторять имя класса дважды за каждый вызов, а не только за объявление. Обратите внимание, что хотя Run() будет очень часто (и, следовательно, подвержен ошибкам копирования-вставки), в некоторых случаях это может различаться, поэтому я считаю, что создание глобальной статической функции - это не очень хорошая идея (но опять же , может использоваться шаблонная специализация этой функции). Это вы имели в виду? –

+3

@JohnDibling: Что я действительно нахожу удивительным, что никакие длинные таймеры здесь не начали «но действительно ли это важно»? серия комментариев. Задавать вопросы, подобные этому, - это как пройти через кирпичную стену, вы должны не только объяснить, почему вы хотите это сделать, но и вы должны убедить людей, почему они хотели бы сделать это, прежде чем они вам помогут. В противном случае они просто будут тратить часы, рассказывая вам, почему вы ошибаетесь, и то, что вы ищете, совершенно не нужно, не говоря уже о том, что вы сказали им, почему вы хотите этого.+1 для хорошего вопроса. – Mehrdad

ответ

9

Проблема в том, что на C++ отсутствует ключевое слово self.

Я обычно пишу:

struct Foo 
{ 
    typedef Foo self; 

    static void bar() 
    { 
     self* ptr = nullptr; 
    } 
}; 

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

С хакером, однако, you can make this entirely autonomous.

+0

Слишком плохо о decltype, это было бы круто (спасибо много за попытку). Но меня все еще утешают, когда кто-то говорит: «Я обычно пишу», меня немного беспокоило, что я пытаюсь достичь глупых вещей. –

+0

http://stackoverflow.com/q/21143835/560648 –

+0

Вы действительно не думали, что выражение, использующее 'this' (даже одно, которое не оценивается), будет работать в статической функции, не так ли? –

3

У C++ нет функции для получения имени текущего класса, пространства имен и т. Д. В C++ 11 вы можете получить тип переменной, но вам нужна переменная в первую очередь. В этом случае вам не с чем начать.

3

Мне нравится идея попытаться ввести общее имя, на которое вы можете ссылаться в несвязанных классах; для ремонтопригодности.

Мой первый подход был бы простым: Предоставьте typedef в прилагаемом классе. Дайте typedef одинаковое имя в каждом несвязанном классе.

class Impossible { 
public: 
    typedef Impossible Enclosing; 
    static void Fun() 
    { 
     Enclosing* theObject = 0; 
    } 
}; 

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

+0

ничего себе, так элегантно. не могу понять, как я этого не видел. Благодарю. –

Смежные вопросы