簡體   English   中英

重載左值和左值參考的工廠函數-高效初始化

[英]Overloading factory function for rvalue and lvalue reference - efficient initializing

考慮以下代碼:

struct b{
//slow to copy, fast to move data
};

template<class T>
struct c{
    c(T &&, b &&){}
    c(T &&, const b &){}
    //do I have to provide both? 
};

template<class T>
auto
make_c(T &&t, b &&_){
    return c<T>(std::forward<T>(t), std::move(_));
}

template<class T>
auto
make_c(T &&t, const b &_){
    return c<T>(std::forward<T>(t), _);
}
//do I have to make both make_c overloads?

就像評論所說的那樣-是否必須同時制作rvalue和lvalue make_函數/構造函數,還是有一種避免代碼重復的方法。 我必須說,我對刪除大多數功能代碼只是刪除移動功能感到不舒服。

PS:這是一個綜合示例-由於msvc編譯器與operator |有關的問題,因此無法添加其他模板參數operator | 超載。

如果要避免復制代碼,則需要使用前向引用 但是,這些基於模板自變量推導。 也就是說,您可以使用以下方式:

template<typename T, typename B>
auto
make_c(T&& t, B&& _){
    return c<T>(std::forward<T>(t), std::forward<B>(_));
}

盡管使用手動重載可能會起作用,但是當您有多個參數需要對lvalue和rvalue參數進行不同的處理時,這樣做並不能完全起作用:所需的重載數量會隨此類參數的數量呈指數增長。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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