假設我想開發一個通用庫,該類庫應該可用於數字類型類型,包括double類型和用戶定義類型。 ,我面對現在的問題是,我不知道如何編寫一個函數模板的返回類型很多像這樣的:對於基本類型,確定「通用函數」的返回類型
template<class T>
auto transmogrify(T x)
-> ???
{
using std::abs;
return abs(x)+2.0;
}
using聲明使得這個函數模板的機身做工因爲這些沒有關聯的命名空間(因此沒有ADL)。但我希望transmogrify在用戶定義類型的作者提供自己的abs函數的情況下使用專用的abs函數。我不能簡單地用
-> decltype(abs(x)+2.0)
,因爲這不會,比如說,加倍工作,因爲的std :: ABS是不是在範圍(據我可以告訴)。但寫作
-> decltype(std::abs(x)+2.0)
將禁用ADL。但禁用ADL不是一種選擇。另外,由專門的abs函數返回的值可能不是T類型,而是其他類型。
關於如何解決返回類型問題的任何想法,同時(a)保持ADL和(b)對於不提供專門的abs的類型,在某些默認函數(如std :: abs) 。
'#define ab using std :: abs; your_template_fn #undef ab'不知道如果這個好的選擇 –
任何人都可以評論上面的事情是好還是不好? –
@Anubis先生以及如何確定返回類型的函數使用這個定義? – ForEveR