簡體   English   中英

當唯一的區別是參數的常量時,是否可以將兩個模板函數編寫為一個?

[英]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.

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