Макрос, чтобы протестировать, подписывается ли целый тип или не подписан

Поскольку строки являются столбцами в транспонированной матрице; соответствовать вашему примеру; просто

rowMatrix :: [[a]] -> Int -> [a]
rowMatrix xs m = transpose xs !! (m-1)

Я тоже должен был исправить твой тип. Также обратите внимание на проблему off-by-1.

> rowMatrix [[1,2,3,4], [5,6,7,8], [9,10,11,12]]  3
[3,7,11]
it :: [Int]
17
задан botismarius 15 September 2008 в 17:21
поделиться

10 ответов

Если то, что Вы хотите, является простым макросом, это должно добиться цели:

#define is_type_signed(my_type) (((my_type)-1) < 0)
26
ответ дан 30 November 2019 в 10:06
поделиться

Если Вы хотите макрос затем, это должно добиться цели:

#define IS_SIGNED( T ) (((T)-1)<0)

В основном, бросок-1 к Вашему типу и видят, все еще ли это-1. В C++ Вам не нужен макрос. Всего #include <limits> и:

bool my_type_is_signed = std::numeric_limits<my_type>::is_signed;
4
ответ дан 30 November 2019 в 10:06
поделиться

В C++ используйте std::numeric_limits<type>::is_signed.

#include <limits>
std::numeric_limits<int>::is_signed  - returns true
std::numeric_limits<unsigned int>::is_signed  - returns false

См. http://msdn.microsoft.com/en-us/library/85084kd6 (По сравнению с 80) .aspx.

39
ответ дан 30 November 2019 в 10:06
поделиться

В C++ можно сделать:


bool is_signed = std::numeric_limits<typeof(some_integer_variable)>::is_signed;

numeric_limits определяется в < пределы> заголовок.

1
ответ дан 30 November 2019 в 10:06
поделиться

Я на самом деле просто задавался вопросом то же самое ранее сегодня. Следующее, кажется, работает:

#define is_signed(t)    ( ((t)-1) < 0 )

я протестировал с:

#include <stdio.h>

#define is_signed(t)    ( ((t)-1) < 0 )
#define psigned(t) printf( #t " is %s\n", is_signed(t) ? "signed" : "unsigned" );

int
main(void)
{
    psigned( int );
    psigned( unsigned int );
}

, который печатает:

int is signed
unsigned int is unsigned
1
ответ дан 30 November 2019 в 10:06
поделиться

Для C++ существует повышение:: is_unsigned< T>. Мне любопытно, почему Вам нужен он хотя, по моему скромному мнению, существует немного серьезных оснований.

0
ответ дан 30 November 2019 в 10:06
поделиться

Вы могли сделать это лучше с шаблонной функцией, меньшим макро-противным бизнесом.

    template <typename T>
        bool IsSignedType()
        {
           // A lot of assumptions on T here
           T instanceAsOne = 1;

           if (-instanceAsOne > 0)
           {
               return true;
           }
           else
           {
               return false;
           }
}

Прощают форматирование...

я испытал бы это и видел бы, работает ли это...

-1
ответ дан 30 November 2019 в 10:06
поделиться

Ваше требование не является точно лучшим, но если требуется взломать вместе определение, одна опция могла бы быть:

#define is_numeric_type_signed(typ) ( (((typ)0 - (typ)1)<(typ)0) && (((typ)0 - (typ)1) < (typ)1) )

Однако это не считают хорошим или портативное каким-либо образом.

2
ответ дан 30 November 2019 в 10:06
поделиться

Althout typeof не является легальный C++ в данный момент, можно использовать шаблонный вычет вместо этого. См. пример кода ниже:

#include <iostream>
#include <limits>

template <typename T>
bool is_signed(const T& t)
{
  return std::numeric_limits<T>::is_signed;
}

int main()
{
  std::cout << 
    is_signed(1) << " " << 
    is_signed((unsigned char) 0) << " " << 
    is_signed((signed char) 0) << std::endl;
}

Этот код распечатает

  1 0 1
1
ответ дан 30 November 2019 в 10:06
поделиться

В C Вы не можете записать макрос, который продолжает работать пока еще неизвестное определение типа фундаментальных целых типов.

В C++, Вы можете, пока Ваш тип является фундаментальным целым типом или определением типа фундаментального целого типа. Вот то, что Вы сделали бы в C++:

template <typename T>
struct is_signed_integer
{
    static const bool value = false;
};

template <>
struct is_signed_integer<int>
{
    static const bool value = true;
};

template <>
struct is_signed_integer<short>
{
    static const bool value = true;
};

template <>
struct is_signed_integer<signed char>
{
    static const bool value = true;
};

template <>
struct is_signed_integer<long>
{
    static const bool value = true;
};

// assuming your C++ compiler supports 'long long'...
template <>
struct is_signed_integer<long long>
{
    static const bool value = true;
};

#define is_this_type_signed(my_type) is_signed_integer<my_type>::value
-1
ответ дан 30 November 2019 в 10:06
поделиться