可以使用decltype强制转换值吗?
Cast a value using decltype, is it possible?
是否可以使用decltype来强制转换值?
例如,假设我们有以下模板:
template<typename Container>
auto findInposition(Container& c,int position)->decltype(*(c.begin()))
{
if(std::distance(c.begin(),c.begin()+position)<c.size())
return c.at(p);
/*else
return decltype(*(c.begin())(somevalue);*/
}
返回容器中特定position
处Item的值。假设用户输入的位置大于容器的大小,在这种情况下,我想返回一个强制转换的值,假设一个强制转换的零或其他东西。我不知道我的例子是否足够好,我的主要问题是:是否有可能使用decltype
转换值,如果是,如何?
一般情况下,您可以这样做。例如:
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
,您可以将decltype
的输出转换为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);
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
}
相关文章:
- 防止主数据类型C++的隐式转换
- 模板参数替换失败,并且未完成隐式转换
- 努力将整数转换为链表。不知道我在这里做错了什么
- HEX值到wchar_t字符(UTF-8)的转换
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将 Qvector<uint8_t> 转换为 QString
- 如何在cuSparse中使用cusparseXcoo2csr从coo转换为csc
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 在c++中使用nlohmann从类到json的转换
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 将Integer转换为4字节的unsined字符矢量(按大端字节顺序)
- 在VS2010-VS2015下编译时,如何使用decltype作为较大类型表达式的LHS
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 如何使用OpenCV将RBG图像转换为HSV,并将H、S和V值保存为C++中的3个独立图像
- 复制列表初始化的隐式转换的等级是多少
- decltype 所需的不完整类型的派生到基数转换
- 有没有办法在宏中将decltype转换为字符串
- decltype 错误 C2440 无法从'int *'转换为'int *&'
- 'decltype':函数返回类型"T"转换为用户定义类型的"T&"(VS2010)
- 可以使用decltype强制转换值吗?