gpt4 book ai didi

c++ - 使用 decltype 转换一个值,这可能吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:46:11 25 4
gpt4 key购买 nike

是否可以使用 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);*/
}

返回容器中特定位置 的项目值。假设用户输入的位置大于容器的大小,在这种情况下我想返回一个转换值,比如说转换为零或其他值。我不知道我的例子是否足够好,我的主要问题是:是否可以使用 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,您可以通过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);
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
}

关于c++ - 使用 decltype 转换一个值,这可能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16687172/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com