一般來說,你可以做到這一點。例如:
int i = 0;
double d = 3.14;
i = static_cast<decltype(i)>(d);
但是,請記住你的函數返回一個參考(因爲decltype(*(c.begin()))
計算結果爲引用類型):
std::vector<int> v;
static_assert(std::is_same<decltype(*v.begin()), int&>::value, "!"); // Won't fire
什麼是在這種情況下,麻煩的是,該功能必須能夠返回對Container::value_type
類型對象的引用,但如果somevalue
具有不同的類型,則無法將其引用返回爲Container::value_type&
。
的道理是一樣的,爲什麼你不能做到以下幾點:
int i = 42;
float& f = static_cast<float&>(i);
所以,你需要問自己的第一件事情是你findInposition()
功能是否真的應該返回一個參考的元素收集(在這種情況下,你想要做什麼是不可能的,就像上面的例子一樣),或者通過值返回該元素的副本。
如果是這樣的話,你堅持使用decltype
,您可以通過std::decay
變換decltype
輸出:
#include <type_traits>
template<typename Container>
auto findInposition(Container& c,int position) ->
typename std::decay<decltype(*c.begin())>::type
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
{
if(std::distance(c.begin(),c.begin()+position)<c.size())
return c.at(position);
else
return static_cast<
typename std::decay<decltype(*c.begin())>::type>(somevalue);
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
}
但在我看來,以下是更清晰:
template<typename Container>
auto findInposition(Container& c,int position) ->
typename Container::value_type
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
{
if(std::distance(c.begin(),c.begin()+position)<c.size())
return c.at(position);
else
return static_cast<typename Container::value_type>(somevalue);
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
}
你嘗試過嗎? – stijn
是的,但你需要改變類型。截至目前,它是一個非常規的參考。 –