[英]Is it possible to write two template functions as one when the only difference is the const-ness of an argument?
我有類似的東西:
template <class Foob, class T>
void do_it(Foob& f, T& t) { f.proc(t); }
template <class Foob, class T>
void do_it(Foob& f, const T& t) { f.proc(t); }
一些Foob
采用const T&
s而其他Foob
采用T&
s,或者相同的Foob
甚至可以有兩個proc
,一個用於const
case,一個用於非const
case,用於做不同的事情。
但是, do_it
的代碼是相同的:它只是f.proc(t)
。 有時代碼是多行,但仍然相同。 有沒有辦法把do_it
寫成一個函數? 像這樣的東西,雖然這顯然不起作用:
template <class Foob, class MaybeConst, class T>
void do_it(Foob& f, MaybeConst T& t) { f.proc(t); }
實際上如果t
參數總是左值,那么你只需要第一次重載! 如果左值具有類型const U
,那么模板參數T
被推導為const U
,而實例化函數的第二個參數類型將是const U&
,它將很好地綁定到const lvalue。
僅當參數是rvalue時才需要第二個重載。 但是,為什么不使用完美轉發,而不是將其作為特殊情況?
// works for both lvalues and rvalues with any cv-qualification
template <class Foob, class T>
void do_it(Foob& f, T&& t) { f.proc(std::forward<T>(t)); }
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.