假設我有一個簡單的Duration類:
class Duration
{
int seconds;
public:
Duration(int t_seconds) : seconds(t_seconds) { }
};
int main()
{
Duration t(30);
t = 60;
}
我決定我不喜歡能夠隱式轉換 from intto Duration. 我可以制作建構式explicit:
class Duration
{
int seconds;
public:
explicit Duration(int t_seconds) : seconds(t_seconds) { }
};
int main()
{
Duration t(30); // This is fine, conversion is explicit
t = 60; // Doesn't compile: implicit conversion no longer present for operator=
}
但是,如果我不想立即破壞所有隱式轉換為 的呼叫代碼Duration怎么辦?我想要的是這樣的:
class Duration
{
int seconds;
public:
[[deprecated]]
Duration(int t_seconds) : seconds(t_seconds) { }
explicit Duration(int t_seconds) : seconds(t_seconds) { }
};
int main()
{
Duration t(30); // Compiles, no warnings, uses explicit constructor
t = 60; // Compiles but emits a deprecation warning because it uses implicit conversion
}
這將允許現有代碼在識別當前依賴于隱式轉換的任何位置的同時進行編譯,因此可以將它們重寫為使用顯式轉換(如果打算使用顯式轉換)或重寫為具有正確的行為(如果不是)。
然而,這是不可能的,因為我不能Duration::Duration(int)用Duration::Duration(int).
有沒有辦法實作這樣的效果,而不是“使轉換顯式,接受呼叫代碼在您撰寫適當的更改之前不會編譯”?
uj5u.com熱心網友回復:
您可以Duration(int t_seconds)變成一個可以接受 anint并將其設定為已棄用的模板函式。
#include<concepts>
class Duration {
int seconds;
public:
template<std::same_as<int> T>
[[deprecated("uses implicit conversion")]]
Duration(T t_seconds) : Duration(t_seconds) { }
explicit Duration(int t_seconds) : seconds(t_seconds) { }
};
如果您允許t = 0.6,只需將 更改same_as為convertible_to。
演示。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/371775.html
