Я пишу некоторые вспомогательные функции для проекта, над которым я работаю. Я всегда хотел оператор typeof. Я знаю, что его нет в моей текущей IDE (visual studio '10), поэтому я пытаюсь написать для него реализацию. Это должно работать примерно так:
auto var = new typeof(<expression>);
Это должен быть тип, извлекаемый во время компиляции, основанный на выражении, и это должно быть возможно. С++ использует это при вызове аргументов шаблона, например:
template< typename A >
void foo(A unused) {
/* can be invoked like foo(5) with A = int */
typedef A type;
type * used = new type;
}
Поэтому я подумал, что могу поиграть с макросами, классами и шаблонами... что-то вроде этого:
#define typeof(expression) (_type_creater().inducer(expression)::type)
template<typename T>
class _type_holder{
public:
typedef T type;
};
class _type_creater{
public:
template< class B >
_type_holder<B> inducer(B _temp) {
/* Here compiler induces the templated expression and creates a typename out of it.
this we can use extract typename from _type_holder, except a instantiatet type apparantly
doesn't have access to typedef'd typenames.
*/
return _type_holder<B>();
}
};
Итак, проблема в основном в том, что это незаконно:
struct a
{
typedef int type;
}
...
a mya;
new mya::type; //or mya.type
Итак, первый вопрос: почему это незаконно? Почему вы не можете получить имена типов из типов экземпляров? Второй вопрос, могу ли я это сделать вообще? Я попытался найти TYPEOF для повышения, но не смог понять его, и кажется, что он просто использует ошибки в компиляторах VC ("//Специальная функция ошибки VC7.0", "//Специальная функция ошибки VC8.0", "/ / Это использует хорошую функцию ошибки VC6.5 и VC7.1"). Мне не повезло?
decltype
. - person ildjarn   schedule 23.03.2012::
(разрешение области видимости, поскольку области видимости существуют только во время компиляции). Ко всему, что существует во время выполнения, можно получить доступ с помощью.
(членский доступ). На самом деле, классы не существуют и во время выполнения, это всего лишь несколько байтовых блоков, с которыми связаны определенные функции и члены которых находятся только на определенных смещениях. Во всяком случае, это моя интерпретация. - person Xeo   schedule 23.03.2012decltype
имеет некоторые проблемы в VS 2010. А именно, он, по-видимому, использует более старую версию предложенияdecltype
и не поддерживает использованиеdecltype
для нестатических членов класса. - person Justin Time - Reinstate Monica   schedule 28.04.2016