簡體   English   中英

C ++ 11自動。 從float轉換為long

[英]C++11 auto. convert from float to long

是否可以將foo從float轉換為long(反之亦然)?

auto foo = float(1234567891234.1234);
cout << "foo: " << foo << endl;

foo = long(1234567891234.1234);
cout << "foo: " << foo << endl;

輸出始終為:

foo: 1.23457e+12
foo: 1.23457e+12

並非以您編寫的方式。 第一,

auto foo = float(1234567891234.1234);

使用自動類型推導規則來推斷RHS的類型,結果為float 完成此操作后, foo的類型為float並設置為石頭(C ++是靜態類型的 ,與Python不同)。 下次寫時

foo = long(1234567891234.1234);

foo的類型仍然是float ,並且沒有神奇地更改為long

如果要模擬類型的“更改”,則最多可以執行強制轉換:

 cout << "foo (as long): " << static_cast<long>(foo) << endl;

或使用其他變量

long foo_long = foo; // again you may have a loss of precision 

但請注意由於浮點表示法可能導致的精度損失。

如果可以訪問C ++ 17編譯器,則可以使用std::variant<long, float> (是類型安全的聯合)在類型之間進行切換。 如果沒有,您可以使用簡單的舊聯合,例如

#include <iostream>

union Foo
{
    float f;
    long l;
};

int main()
{
    Foo foo;
    foo.f = float(1234567891234.1234); // we set up the float member
    std::cout << "foo: " << foo.f << std::endl;

    foo.l = long(1234567891234.1234); // we set up the long member
    std::cout << "foo: " << foo.l << std::endl;
}

住在科利魯

或者,您可以使用類似類型的擦除技術

#include <iostream>

int main()
{
    void *foo; // we will store the object via this pointer

    foo = new int{42};
    std::cout << *(int*)foo << '\n';
    operator delete(foo); // don't do delete foo, it is undefined behaviour

    foo = new float{42.42};
    std::cout << *(float*)foo << '\n';
    operator delete(foo); // don't do delete foo, it is undefined behaviour
}

住在科利魯

上面代碼的現代版本可以使用std::shared_ptr例如

#include <iostream>
#include <memory>

int main()
{
    std::shared_ptr<void> foo{new int{42}};
    std::cout << *(int*)foo.get() << '\n';

    foo.reset(new float{42.42});
    std::cout << *(float*)foo.get() << '\n';
}

住在科利魯

std::unique_ptr<void>將不起作用,因為只有std::shared_ptr實現類型擦除。

當然,如果您不太在意存儲大小等,只需使用2個單獨的變量。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM