У меня есть шаблон этого класса:
template <class Tin, class Tout>
class Foo
{
Tin input;
Tout output;
static inline void __ensure_type_consistency
{
int16_t* p = (int16_t *)0;
// uint16_t* p1 = p;
Tin* check_type_in = p;
Tout* check_type_out = p;
}
public:
...
}
Я хочу убедиться, что Tin
и Tout
оба typedef'd для типа int16_t
, а не какой-то другой тип.( ПРИМЕЧАНИЕ: . Пожалуйста, прочитайте полный вопрос, прежде чем делать выводы )
Если я раскомментирую закомментированную строку, я получаю ожидаемую ошибку;компилятор не позволяет указателям разных типов присваиваться друг другу без приведения:
"src\foo.h", line 47: error #145: a value of type "int16_t *"
cannot be used to initialize an entity of type "uint16_t *"
Но если я оставлю это закомментированным, и я создаю его экземпляр:
Foo<uint16_t, int32_t> illegalFoo;
Я не получаю ошибки компилятора, даже если используется тот же тип проверки (создание несовместимого назначения указателя в статической функции, которая фактически никогда не вызывается, но которая должна вызывать ошибки компилятора)
Isесть способ создать статическую проверку согласованности типов во время компиляции? Почему не работает тот, который я использую?
NOTE : на мгновение игнорировать очевидное решениепросто избавиться от параметров шаблона.Это "решило бы" эту проблему, но здесь есть некоторые внеполосные вещи, происходящие здесь с моими инструментами отладки, где используются typedef для передачи важных метаданных: я хочу убедиться, что Foo.input
имеет тип Tin
, гдеTin
- это либо int16_t
, либо typedef, который разрешается как int16_t
, так же как с Foo.output
и Tout
.Существуют небольшие различия с точки зрения моих инструментов отладки, где можно различать типы typedef и их базовый тип, даже если в программе на C ++ они идентичны.
edit: кстати, это встроенная система, и я не могу использовать Boost.Это также не C ++ 0x.