01/10/2018, 14:14

Có thể ép kiểu số thực thành số nguyên dùng static_cast với auto được không?

Chào mọi người. Có thể đây là một câu hỏi ngu, nhưng mình đã thử tìm google nhưng không có kết quả gì.

Mình có tìm hiểu, muốn ép kiểu thực thành nguyên thì

int d = static_cast<int>(f);
long long lld = static_cast<long long>(f);
...

Tuy nhiên vì 1 số mục đích nên mình muốn static_cast tự động ép kiểu theo biến đã khai báo sẵn.

INT_TYPE d; // không biết, và cũng không muốn biết d là kiểu nguyên gì
// 1 đoạn code rất dài
d = static_cast<...>(f)

Bình thường người ta hay dùng auto gần như để tự xác định kiểu của biến. Vậy thì có thể dùng auto trong trường hợp trên không?

Florastamine viết 16:31 ngày 01/10/2018

typedef đi

typedef my_long_ass_type type;
type t = static_cast<type>(v);
Dark.Hades viết 16:25 ngày 01/10/2018

auto nó phải biết được kiểu dữ liệu của vế phải trước tại quá trình compile
// by someone

auto a = 4 ; // int
auto b = 4U ; // unsigned int
auto c = 4L ; // long int
auto d = 4LLU; // unsigned long long int, maybe it's ULL i don't remember...
auto x = 4.0 ; // double
auto y = 4.0f ; // float

Trường hợp bạn sử dụng cast thì auto nó tự lấy cái decltype của cái <| decl |> làm kiểu dữ liệu.

Việc dùng static_cast (các loại hàm cast mặc định) trong C++ giúp chương trình an toàn hơn.

Bạn có thể làm như @Florastamine hoặc có một cách khác là khai báo sẵn biến mà bạn muốn cast dữ liệu sang, sau đó dùng decltype để cast ngược lại.

double f = 1.f;
long long d;
auto a = static_cast<decltype(d)>(f);

// Kiểu này thì xấu, tuy nhiên biết đâu có khi xài

HK boy viết 16:21 ngày 01/10/2018

auto d = 4LLU; // unsigned long long int, maybe it’s ULL i don’t remember…

ULL hay LLU đều như nhau cả. Kì cục ghê.

Dùng typedef có sợ bị dính vào các trường hợp nguy hiểm không? Kiểu như

typedef long long int;

ấy.

Dark.Hades viết 16:25 ngày 01/10/2018

Dùng typedef có sợ bị dính vào các trường hợp nguy hiểm không? Kiểu như

typedef long long int;

ấy.

Mình chưa hiểu trường hợp nguy hiểm là sao?
typedef sẽ lấy cái đoạn TEXT ở cuối cùng làm kiểu dữ liệu.
http://en.cppreference.com/w/cpp/language/typedef

HK boy viết 16:24 ngày 01/10/2018

Mình từng code

typedef long long int;

thì bị báo lỗi ở chỗ int main(), nên mình sợ nếu sử dụng typedef thì sẽ dính vào trường hợp như vừa rồi; mình vẫn chưa thực sự thông cách typedef của @Florastamine lắm.

Dark.Hades viết 16:24 ngày 01/10/2018

À à, hiểu rồi, mình chưa đọc hết dòng
Việc bạn thực hiện typedef ghi đè lên một kiểu có sẵn nên compiler nó báo lỗi là đương nhiên rồi.

Cách sử dụng:

typedef <EXIST_TYPE> <NEW_SHORT_TYPE_FOR_THAT>;
typedef const int* ci_ptr_t; // Kiểu dữ liệu mới lúc này chỉ cần viết : ci_ptr_t
=>
  int i = 1;
  const int* x = &i;
  ci_ptr_t ss = x;
HK boy viết 16:29 ngày 01/10/2018

// Kiểu này thì xấu, tuy nhiên biết đâu có khi xài

Đúng là kiểu này xấu thật, nhưng mình nghĩ áp dụng cách của bạn là ổn thoả nhất. Cảm ơn bạn nhiều <3

Florastamine viết 16:27 ngày 01/10/2018

A decltype hay nè, nhưng trường hợp này e là lấy dao mổ trâu giết gà :’(

Bài liên quan
0