подписанный int vs int - есть ли способ отличить их в C ++?

Есть ли шаблон или подход, который можно было бы использовать, чтобы различать объявления signed int и int, как в следующем примере

signed int foo;
int bar;
static_assert(magic_signed<decltype(foo)>::value,"signed"); //PASS
static_assert(magic_signed<decltype(bar)>::value,"not signed"); //ASSERT

person hutorny    schedule 05.11.2018    source источник
comment
int по умолчанию signed.   -  person πάντα ῥεῖ    schedule 05.11.2018
comment
Это преднамеренно, что он называется bar в объявлении, а затем используется как baar?   -  person Blaze    schedule 05.11.2018
comment
@Blaze - спасибо, что указали, исправлено   -  person hutorny    schedule 05.11.2018
comment
моя вера никуда не годится. после компиляции вы не можете различить int и signed int, они одинаковы.   -  person datdinhquoc    schedule 05.11.2018
comment
Вы не можете различить декларации. Вы можете различать типы.   -  person n. 1.8e9-where's-my-share m.    schedule 05.11.2018
comment
Итак, у вас есть вопрос, и это хорошо, но контекст тоже хорош. Почему вы хотите сказать? В чем, по вашему мнению, это поможет вам?   -  person Fantastic Mr Fox    schedule 05.11.2018
comment
@Fantastic Mr Fox - например, в протоколе int32 и sint32 кодируются по-разному. Таким образом, у них есть три разных типа - int32, sint32 и uint32. Имея возможность отличать подписанный int от int, это позволит осуществлять прямое сопоставление между типами в C ++ и protoc.   -  person hutorny    schedule 05.11.2018
comment
Это все синонимы: int, signed, signed int, int signed. Все они одного типа. Те, которые опускают int, int неявно. Те, которые опускают signed, signed неявно. Порядок не имеет значения.   -  person Eljay    schedule 05.11.2018
comment
В этом отношении это char весьма своеобразно: это зависит от реализации, является ли char подписанным или неподписанным, но это отдельный тип от signed char и unsigned char. Для других целочисленных типов signed T является тем же типом, что и T.   -  person Pete Becker    schedule 05.11.2018
comment
Protobuf - это не C ++. Это самостоятельный язык со своими типами. Нет закона природы, который гласит, что должно существовать естественное сопоставление между типами Protobuf и C ++, да и вообще его нет. Ваша задача - предоставить отображение, подходящее для вашего приложения.   -  person n. 1.8e9-where's-my-share m.    schedule 06.11.2018
comment
@ n.m. Да, это то, что я ищу - средство для создания сопоставления типов. Ключевое слово с подписью могло бы быть среди них, если бы его можно было обнаружить из шаблонов.   -  person hutorny    schedule 07.11.2018
comment
Это не имеет никакого смысла. В protobuf int32 и sint32 - это разные кодировки для одного и того же диапазона 32-битных знаковых целых чисел. Они используют разное кодирование, чтобы работать с разными типами распределения значений. Один более эффективен с маленькими положительными числами, чем с отрицательными или большими числами. Другой одинаково эффективен со всеми значениями. В C ++ есть заметки, отдаленно похожие на это. Разработчик приложения должен сопоставить int32_t с любым типом protobuf, в зависимости от того, какой диапазон значений он ожидает от этой конкретной переменной.   -  person n. 1.8e9-where's-my-share m.    schedule 07.11.2018
comment
@ n.m. например, если я объявляю свой член C ++ как unsigned int, он записывается как uint32 protobuf, если я использую signed int или просто int - он записывается как sint32, и у меня еще нет средств C ++, чтобы указать int32   -  person hutorny    schedule 07.11.2018
comment
Если ваша цель - найти типы C ++, подходящие для прямого сопоставления с этими конкретными типами protobuf, вы должны были сказать об этом в вопросе. В противном случае ответ просто отрицательный. Ключевое слово signed, прикрепленное к объявлению C ++ (кроме char), не имеет большего значения, чем окружающие его пробелы. Вы не можете обнаружить ни в шаблоне, ни в каком-либо другом виде метапрограммирования.   -  person n. 1.8e9-where's-my-share m.    schedule 07.11.2018
comment
Похоже, это проблема XY. X - как мне эффективно использовать различие Protobuf int и sint при написании кода на C ++? Воспринимаемое решение Y - вот почему, конечно, я пишу int вместо int и подписываю int для sint. Тогда Y становится вашей новой проблемой. Как отличить эти типы C ++? Но решение изначально неверное.   -  person n. 1.8e9-where's-my-share m.    schedule 07.11.2018


Ответы (2)


Что ж, несмотря на то, что signed int и int одинаковы, я думаю, вы могли иметь в виду, как отличить unsigned int и int. Взгляните на std::is_signed. Это доступно после c ++ 11.

https://en.cppreference.com/w/cpp/types/is_signed

Также есть std::is_unsigned

https://en.cppreference.com/w/cpp/types/is_unsigned

Если вы действительно имели в виду, как отличить signed int от нормального int, я не думаю, что вы можете, потому что int неявно понимается компилятором как означающее signed int, поэтому на самом деле это одно и то же.

Взгляните и на это. Разница между объявлением int и подписанным int

person chasep255    schedule 05.11.2018
comment
Я знаю, как отличить unsigned int и int с помощью std :: is_signed - person hutorny; 05.11.2018
comment
Что ж, как я уже сказал, нет никакой разницы между подписанным и нормальным int, поэтому нет реального смысла различать их. - person chasep255; 05.11.2018

int, signed int и signed относятся к одному типу.

unsigned int и unsigned относятся к одному типу.

person Swordfish    schedule 05.11.2018