gpt4 book ai didi

c++ - 数组编译时生成?

转载 作者:行者123 更新时间:2023-11-28 06:39:30 24 4
gpt4 key购买 nike

this answer (阅读整个问题和答案并不是绝对必要的)一些代码会产生一个编译时数组,如:

template<unsigned...Is,class Tuple>
unsigned index_of(indexes<Is...>,void const* p, Tuple const&t){
void const* r[]={ nullptr, &std::get<Is>(t)... }; // <-- this is the array I'm referring to
auto it = std::find( std::begin(r), std::end(r), p );
if (it==std::end(r))
return -1;
else
return (it-std::begin(r))-1;
}

我的问题是:该数组是否完全由元组的每个元素的地址在编译时生成?那是编译时的优势吗?或者数组是运行时生成的(在那种情况下,编译时的优势在哪里?)


改写:为什么复杂的模板代码here有必要,而不是一个简单的运行时函数,它用一个 for 循环遍历元组的所有元素并比较指针吗?这一切有什么好处??关于阵列创建的事情?我没有真正看到它,我不敢相信所有的工作都是白做的,或者只是吹嘘“我可以用模板把东西搞砸,看看

最佳答案

不,因为元组地址在编译时是未知的。编译时唯一知道的是数组的大小,因为它是从元组的大小中提取的(通过包扩展)。

这是一个奇怪的算法,它只通过 void* 进行类型删除,以便能够将元组元素存储在数组上,然后通过标准算法对它们执行某些操作。

这更有意义(为了更清楚,省略了索引技巧):

template<typename Tuple , typename T>
bool find_in_tuple( const Tuple& t , const T& e )
{
bool result[] = { (std::get<Indices>( t ) == e)... };

return std::any_of(std::begin(result) , std::end(result) , [](bool b){ return b; } );
}

Here是一个运行的例子。

对于 index_of 特性,你可以在做 any_of() 时在闭包中添加一个计数器,或者做一些更复杂的事情:

template<typename Tuple , typename T>
std::index_of index_of( const Tuple& t , const T& e )
{
std::size_t index = 0;
std::tuple<bool,std::size_t> result[] = { std::make_tuple(Indices,std::get<Indices>( t ) == e)... };

bool exists = std::any_of(std::begin(result) , std::end(result) , [&](const std::pair<std::size_t,bool>& p){ index = p.first; return p.second; } );

if(exists)
return index;
else
throw std::bad_argument{};
}

关于c++ - 数组编译时生成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26205732/

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