小编Hip*_*der的帖子

以编译方式在C++中编译时创建静态数组

可以在编译时定义静态数组,如下所示:

const std::size_t size = 5;    
unsigned int list[size] = { 1, 2, 3, 4, 5 };
Run Code Online (Sandbox Code Playgroud)

问题1 - 是否可以通过使用各种元编程技术在编译时"以编程方式"分配这些值?

问题2 - 假设数组中的所有值都是相同的barr,是否可以在编译时以编程方式选择性地分配值?

例如:

const std::size_t size = 7;        
unsigned int list[size] = { 0, 0, 2, 3, 0, 0, 0 };
Run Code Online (Sandbox Code Playgroud)
  1. 欢迎使用C++ 0x的解决方案
  2. 阵列可能非常大,几百个元素长
  3. 现在的数组只包含POD类型
  4. 还可以假设,以静态编译时兼容的方式预先知道阵列的大小.
  5. 解决方案必须是C++ (没有脚本,没有宏,没有pp或基于代码生成器的解决方案)

更新: Georg Fritzsche的解决方案非常棒,需要一些工作才能在msvc和intel编译器上进行编译,但这仍然是解决问题的一种非常有趣的方法.

c++ metaprogramming static-array

63
推荐指数
3
解决办法
3万
查看次数

在C++中是否有标准的循环迭代器

基于以下问题:检查一个字符串是否是其他字符串的旋转

我正在考虑制作一个带有范围的循环迭代器类型,并且能够像这样解决上述问题:

std::string s1 = "abc" ;
std::string s2 = "bca" ;
std::size_t n = 2; // number of cycles
cyclic_iterator it(s2.begin(),s2.end(),n);
cyclic_iterator end;

if (std::search(it, end, s1.begin(),s1.end()) != end)
{
   std::cout << "s1 is a rotation of s2" << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

我的问题,是否已经有这样的东西?我检查了Boost和STL,但都没有确切的实现.

我有一个简单的手写(源自一个std::forward_iterator_tag专门的版本std::iterator),但宁可使用已经制作/测试过的实现.

c++ iterator stl

22
推荐指数
2
解决办法
2万
查看次数

缓存最终迭代器 - 好主意还是坏主意?

一般来说,为了效率和速度目的,缓存一个结束迭代器(特别是STL容器)是个好主意吗?比如在下面的代码中:

std::vector<int> vint;
const std::vector<int>::const_iterator end = vint.end();
std::vector<int>::iterator it = vint.begin();

while (it != end)
{
   ....
   ++it;
}
Run Code Online (Sandbox Code Playgroud)

在什么条件下最终价值会失效?从容器中擦除会导致所有 STL容器中的结尾无效还是只有一些?

c++ containers iterator stl

18
推荐指数
1
解决办法
2336
查看次数

如何正确使用带有可变参数模板的引用

我有类似下面的代码:

   template<typename T1, typename T2, typename T3, typename T4>
   void inc(T1& t1, T2& t2, T3& t3, T4& t4) { ++t1; ++t2; ++t3; ++t4; }

   template<typename T1, typename T2, typename T3>
   void inc(T1& t1, T2& t2, T3& t3) { ++t1; ++t2; ++t3; }

   template<typename T1, typename T2>
   void inc(T1& t1, T2& t2) { ++t1; ++t2; }

   template<typename T1>
   void inc(T1& t1) { ++t1; }
Run Code Online (Sandbox Code Playgroud)

我想使用即将推出的标准中提出的可变参数模板重新实现它.然而,到目前为止我在网上看到的所有例子似乎都是类似于printf的例子,这里的区别似乎是引用的使用.我想出了以下内容:

inline void inc() { }

template<typename T>
inline void inc(T&& t) { ++t; }

template<typename T,typename …
Run Code Online (Sandbox Code Playgroud)

c++ templates variadic c++11

13
推荐指数
1
解决办法
2862
查看次数

如何获得printf样式的编译时警告或错误

我想写一个像printf这样的例程,而不是功能上的,但是我希望例程能够像printf一样编译检查特性.

例如,如果我有:

{
   int i;
   std::string s;
   printf("%d %d",i);
   printf("%d",s.c_str());
}
Run Code Online (Sandbox Code Playgroud)

编译器抱怨如下:

1 cc1plus: warnings being treated as errors
2 In function 'int main()':
3 Line 8: warning: too few arguments for format
4 Line 9: warning: format '%d' expects type 'int', but argument 2 has type 'const char*'
Run Code Online (Sandbox Code Playgroud)

代码示例

printf和co是编译器对待的特殊函数,还是有一些技巧可以让它在任何用户定义的函数上工作?我感兴趣的具体编译器是gcc和msvc

c++ compiler-construction printf typechecking

12
推荐指数
2
解决办法
5678
查看次数

C++内存中键值存储

我正在寻找有关内存键值存储引擎或库的建议,这些引擎具有C++接口或用C++编写.

我正在寻找能够在没有任何问题的情况下扩展到大约100,000个键值对并且在linux和win32/64上兼容/可编译的解决方案

c++ key-value in-memory

4
推荐指数
2
解决办法
7081
查看次数