(如果你是一個C++ 11的親,請跳到大膽的段落。)刪除引用(返回的T而不是T&其中T&是decltype)
比方說,我想寫一個模板它調用和返回傳遞的對象哪種類型的結果的方法是模板參數:
template<ReturnType, T>
ReturnType doSomething(const T & foo) {
return foo.bar(); // EDIT: Might also be an expression introducing a temp val
}
所以T
必須有一個方法ReturnType T::bar() const
爲了在這樣的調用中使用:
struct MyClass {
...
int bar() const;
...
};
...
MyClass object;
int x = doSomething<int, MyClass>(object);
我們沒有寫MyClass
感謝類型推演和呼叫變爲:
int x = doSomething<int>(object);
但省略<int>
編譯錯誤太多的結果,因爲該方法不需要在順序返回INT被分配到之後的x
(例如,它可能會返回char
)。
在的C++ 0x/11我們有auto
和decltype
,使我們可以用它來推斷一個模板方法的返回類型:
template<T>
auto doSomething(const T & foo) -> decltype(foo.bar()) {
return foo.bar(); // EDIT: Might also be an expression introducing a temp val
}
編譯器現在將找出的foo.bar()
類型並且只是將其用作返回類型。隨着我們的具體類MyClass
這將是一個int
及以下就足夠了:
int x = doSomething(object);
現在我的問題:
如果MyClass的bar()
定義爲返回一個int&
的doSomething(object)
返回類型也將是int&
= decltype(foo.bar())
。這是一個問題,因爲現在G ++符合我的返回引用臨時。
我該如何解決這個問題?有沒有像remove_reference
那樣可以像remove_reference(decltype(foo.bar()))
一樣使用?
我想到了剛剛宣佈一個輔助方法,這需要T&
並返回T
,然後定義的doSomething
返回類型爲decltype(helper(foo.bar()))
。但是必須有更好的方式,我感覺它。
這是一個問題?你所要做的就是傳遞參考文獻。是的,有'std :: remove_reference :: type'。 –
GManNickG
@GManNickG我不想在我的程序中發出警告。我想用'-Werror -Wall'進行編譯。感謝'std :: remove_reference'提示,我知道我以前看過這個,但在搜索「C++ 11模板類型扣除刪除參考」時無法在google上找到它,也許我的搜索過於局部化了:) – leemes
不,我說的不應該有任何警告。如果'foo.bar()'返回一個引用,那麼你應該能夠很好地作爲引用返回。 – GManNickG