一般来说,你可以做到。例如:
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
在这种情况下,麻烦的是该函数必须能够返回对 type 对象的引用Container::value_type
,但如果somevalue
具有不同的类型,您将无法将对它的引用返回为Container::value_type&
.
原因与不允许您执行以下操作的原因相同:
int i = 42;
float& f = static_cast<float&>(i);
所以你需要问自己的第一件事是你的findInposition()
函数是否真的应该返回对集合元素的引用(在这种情况下,你想要做的事情是不可能的,就像上面的例子一样),或者更确切地说是按值返回该元素的副本。
如果是这种情况,并且您坚持使用decltype
,则可以转换decltype
through的输出std::decay
:
#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);
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
}