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