[英]Autodetect return type of template function
我有一些帶有功能的類。 在所有類中,函數均具有相同的名稱和參數類型,但返回類型不同。 我需要一些模板功能,可以自動檢測正確的模板替換而無需尖括號。
測試代碼來說明問題:
struct Float
{
static Float convert(int i)
{
return Float{static_cast<float>(i)};
}
float _f;
};
struct Int
{
static Int convert(int i)
{
return Int{i};
}
int _i;
};
template<typename T>
T convert(int i)
{
return T::convert(i);
}
int main()
{
Float f1 = convert<Float>(10);
Int i1 = convert<Int>(10);
// Float f2 = convert(10); compilation error
// Int i2 = convert(10); compilation error
return 0;
}
PS模板讓我發瘋,但我無法理解它們。
不知道它是否完全適合您的需求,但是您可以使用類和模板化轉換運算符來模擬您想要的內容:
class convert {
int arg;
public:
convert(int arg) : arg(arg) {}
template<class T>
operator T() const {
return T::convert(arg);
}
};
由於模板參數推導適用於模板轉換操作符,因此您可以這樣編寫:
Float f1 = convert(10);
Int i1 = convert(10);
就像你想要的。
為什么需要轉換功能? 您可以使用單個參數構造函數來完成相同的工作。
struct Float
{
Float(int i)
{
_f = static_cast<float>(i);
}
float _f;
};
struct Int
{
Int(int i)
{
_i = static_cast<int>(i);
}
int _i;
};
int main()
{
Float f2 = 10;
Int i2 = 10;
return 0;
}
如果您擔心對構造函數的隱式調用,則可以使其顯式
struct Float
{
explicit Float(int i)
{
_f = static_cast<float>(i);
}
float _f;
};
int main()
{
Float f2 = Float(10);
return 0;
}
如果具有相同名稱和相同類型的輸入參數的函數可以產生不同的返回類型,則代碼的可讀性會受到影響。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.