有没有一种简单的方法来迭代C中的静态字符串列表
发布时间:2020-12-16 10:51:55 所属栏目:百科 来源:网络整理
导读:我经常需要迭代我的C代码中的字符串列表. 在像Perl这样的语言中,这很容易: foreach my $x ("abc","xyz","123") {.... } 在过去,这就是我在C中所做的 const char* strs[] = { "abc","123" };for (int i=0; isizeof(strs)/sizeof(const char*); i++) { const
我经常需要迭代我的C代码中的字符串列表.
在像Perl这样的语言中,这很容易: foreach my $x ("abc","xyz","123") {.... } 在过去,这就是我在C中所做的 const char* strs[] = { "abc","123" }; for (int i=0; i<sizeof(strs)/sizeof(const char*); i++) { const char *str = strs[i]; ... 如果我已经有一个STL容器,我可以使用BOOST_FOREACH std::vector<std::string> strs; BOOST_FOREACH(std::string str,strs) { ... 我试图创建一个宏来结合所有这些概念,但没有成功. 我希望能够编写这样的代码: SPECIAL_STRING_FOREACH(const char* str,{"abc","123"}) { ... } 肯定有人以前做过这个. 解决方法
这是我的尝试.遗憾的是,它依赖于可变宏,这是一个C99 / C 1x功能.但是在GCC工作.
#include <boost/foreach.hpp> #include <boost/type_traits.hpp> #include <iostream> #define SEQ_FOR_EACH(D,...) if(bool c = false) ; else for(boost::remove_reference<boost::function_traits<void(D)> ::arg1_type>::type _t[] = __VA_ARGS__; !c; c = true) BOOST_FOREACH(D,_t) int main() { SEQ_FOR_EACH(std::string &v,{ "hello","doctor" }) { std::cout << v << std::endl; } } 请注意,您还可以使用引用变量进行迭代,以避免无用的复制.这是一个使用boost.preprocessor和(a)(b)…语法,在预处理阶段后编译为相同的代码. #define SEQ_FOR_EACH(D,SEQ) if(bool c = false) ; else for(boost::remove_reference<boost::function_traits<void(D)> ::arg1_type>::type _t[] = { BOOST_PP_SEQ_ENUM(SEQ) }; !c; c = true) BOOST_FOREACH(D,("hello")("doctor")) { std::cout << v << std::endl; } } 诀窍是组合一个函数类型,该函数类型具有枚举变量作为参数,并获取该参数的类型.然后boost :: remove_reference将删除任何引用.第一个版本使用boost :: decay.但它也会将数组转换为指针,我发现它有时并不是我想要的.然后将结果类型用作数组元素类型. 要在枚举器变量具有依赖类型的模板中使用,您必须使用另一个将typename放在boost :: remove_reference和boost :: function_traits之前的宏.可以将其命名为SEQ_FOR_EACH_D(D ==依赖). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |