小编tom*_*tom的帖子

带有可变参数的c ++模板函数

是否有可能编写一个c ++模板函数,它接受不同类型的可变数量的输入变量(输入的数量可以限制为10)?例如,获取一个sql_exec()执行sql查询字符串的函数,并将结果行保存在所提供类型的std向量中,即

std::vector<double> x,y;
std::vector<std::string> s;
std::string query="select * from ...";

sql_exec(query, s,x,y); // error if less than 3 rows or conversion not possible
Run Code Online (Sandbox Code Playgroud)

现在我的天真方法将是(限于最多2个向量)

struct null_type {};
template <typename T1=null_type, typename T2=null_type>
void sql_query(const std::string& query_str, std::vector<T1>& col1,
           std::vector<T2>& col2) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

当然这是愚蠢的,因为我没有告诉函数有关默认参数,我们得到

error: default template arguments may not be used in function templates
Run Code Online (Sandbox Code Playgroud)

但实际上它用gcc编译-std=c++0x.但是,显然sql_query()仍然不采用可变长度输入,需要使用2个向量调用.此外,我想在大多数当前的编译器上都有可移植的东西.我忽略了什么明显的东西?我知道我可以改变设计,也许可以使用boost::tuple或其他东西,但我喜欢这么简单的界面.

c++ templates variadic-functions template-meta-programming

6
推荐指数
2
解决办法
4025
查看次数

如何解析包含javascript代码的html

如何解析大量使用javascript的html文档?我知道python中有一些库可以解析静态xml/html文件,我基本上是在寻找一个程序或库(甚至是firefox插件),它读取html + javascript,执行javascript位并输出html代码而不用javascript所以如果在浏览器中显示它会看起来相同.

举个简单的例子

<a href="javascript:web_link(34, true);">link</a>
Run Code Online (Sandbox Code Playgroud)

应该用javascript函数返回的适当值替换,例如

<a href="http://www.example.com">link</a>
Run Code Online (Sandbox Code Playgroud)

一个更复杂的例子是一个保存的facebook html页面,里面堆满了大量的javascript代码.

可能与 如何使用Node.js"执行"HTML + Javascript页面有关, 但我真的需要Node.js和JSDOM吗?稍微相关的是 用于渲染HTML和javascript的Python库, 但我对渲染纯html输出不感兴趣.

html javascript python

5
推荐指数
1
解决办法
4727
查看次数

如何以及何时分配全局或静态数组的内存?

在c ++中定义全局或静态数组时,它的内存不会立即保留在程序的开头,而只会在我们写入数组时保留.我发现令人惊讶的是,如果我们只写入数组的一小部分,它仍然不会保留整个内存.考虑以下小例子,它稀疏地写入全局数组:

#include <cstdio>
#include <cstdlib>

#define MAX_SIZE 250000000
double global[MAX_SIZE];

int main(int argc, char** argv) {
   if(argc<2) {
      printf("usage: %s <step size>\n", argv[0]);
      exit(EXIT_FAILURE);
   }
   size_t   step_size=atoi(argv[1]);

   for(size_t i=0; i<MAX_SIZE; i+=step_size) {
      global[i]=(double) i;
   }

   printf("finished\n"); getchar();
   return EXIT_SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)

现在为不同的步长执行此操作并查看top的输出,我们得到例如:

./a.out 1000000
./a.out 100000
./a.out 10000
./a.out 1000
./a.out 100

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
15718 user      20   0 1918m 1868  728 S    0  0.0   0:00.00 a.out
15748 user      20   0 …
Run Code Online (Sandbox Code Playgroud)

c++ arrays static global contiguous

4
推荐指数
1
解决办法
841
查看次数

avx的三个操作数?

为什么avx sqrt(非压缩)指令有三个操作数?

vsqrtsd xmm1, xmm2, xmm3
Run Code Online (Sandbox Code Playgroud)

这是否意味着什么xmm1=xmm2=sqrt(xmm3)

编辑:下面详细解答,但简而言之,装配线意味着:

xmm1.low  = sqrt(xmm3.low);
xmm1.high = xmm2.high;
Run Code Online (Sandbox Code Playgroud)

x86 assembly simd instructions avx

2
推荐指数
1
解决办法
1031
查看次数