c++ 自动覆盖 signed/unsigned
c++ auto with overriding signed/unsigned
在下面的代码中:
#include <armadillo>
using namespace arma;
int main()
{
mat A;
auto x=A.n_rows-5;
....
x
是 long long unsigned int
,我希望它是 long long int
。我该如何解决这个问题?
需要注意的是,在这个库的不同版本上,使用了不同的类型,所以我不能直接提到long long int
,我需要使用auto
。
改变
auto x=A.n_rows-5;
到
long long int x = (long long int)(A.n_rows - 5);
为了抛弃unsigned.
您可以使用 C++11 类型特征库来获取数字类型的 signed or unsigned 版本。
获取无符号整数:
std::make_unsigned<int>::type
因此,要获得 A.n_rows
的签名版本,请尝试:
std::make_signed<decltype(A.n_rows)>::type x = A.n_rows - 5;
对于任何其他限定符,都有相应的模板可以在类型之间进行转换:
- 引用类型 - http://en.cppreference.com/w/cpp/utility/functional/ref
- 指针类型 - http://en.cppreference.com/w/cpp/types/add_pointer
- 等(添加或删除 const 或 volatile 限定符)
由于您已经在使用犰狳,我认为最好(或最简单)的方法是使用 arma::sword
。
sword x = A.n_rows - 5; // This can also compile without C++11.
它将解决 "different versions of this library, different types have been used" 的问题,因为 A.n_rows
的类型是 arma::uword
,它是 arma::sword
的无符号版本。看,http://arma.sourceforge.net/docs.html#uword
在下面的代码中:
#include <armadillo>
using namespace arma;
int main()
{
mat A;
auto x=A.n_rows-5;
....
x
是 long long unsigned int
,我希望它是 long long int
。我该如何解决这个问题?
需要注意的是,在这个库的不同版本上,使用了不同的类型,所以我不能直接提到long long int
,我需要使用auto
。
改变
auto x=A.n_rows-5;
到
long long int x = (long long int)(A.n_rows - 5);
为了抛弃unsigned.
您可以使用 C++11 类型特征库来获取数字类型的 signed or unsigned 版本。
获取无符号整数:
std::make_unsigned<int>::type
因此,要获得 A.n_rows
的签名版本,请尝试:
std::make_signed<decltype(A.n_rows)>::type x = A.n_rows - 5;
对于任何其他限定符,都有相应的模板可以在类型之间进行转换:
- 引用类型 - http://en.cppreference.com/w/cpp/utility/functional/ref
- 指针类型 - http://en.cppreference.com/w/cpp/types/add_pointer
- 等(添加或删除 const 或 volatile 限定符)
由于您已经在使用犰狳,我认为最好(或最简单)的方法是使用 arma::sword
。
sword x = A.n_rows - 5; // This can also compile without C++11.
它将解决 "different versions of this library, different types have been used" 的问题,因为 A.n_rows
的类型是 arma::uword
,它是 arma::sword
的无符号版本。看,http://arma.sourceforge.net/docs.html#uword