Tag: 模板

将模板生成的类分配给具有相同布局的C结构

如果我理解正确,那么对象’A’定义如下: typedef struct { int n; float *p; } myStruct; myStruct A; 是一个聚合,其内存布局与对象’B’完全相同,定义如下: template class myTemplateClass { public: int n; T* p; }; myTemplateClass B; 那么,是否有更优雅的分配方式 A = B; 而不是写 A = *(reinterpret_cast(&B)); 每次? 我的理由是我必须调用一个库函数,该函数使用“myStruct”forms的参数公开一个接口,从代码中以myTemplateClass的forms保存我的数据是非常自然的。

根据C ++模板类型调用不同的C函数

我的问题如下:我有一个C库,它包含每个函数的几个版本,根据它们使用的数据类型,例如: void add(double *a, double *b, double *c); 和 void sadd(float *a, float *b, float *c); 现在,有了一个外部C ++模板函数,我希望能够做到这样的事情: template void myfunc(/*params*/) { // Obtain a,b,c of type T* from params /* If T is double call add(a,b,c); else if T is float call sadd(a,b,c). */ } 我知道它可以通过专门的模板函数来完成,例如: template void myfunc(/*params*/) { // Obtain a,b,c of […]

用“模板”编写C或C ++库

(1)。 使用C ++模板时,编译器(例如g ++)不能直接编译模板定义(只能​​在头文件而不是源文件中),而是根据每个实例的模板定义生成代码,然后才是正确的为其实例化编译生成的代码? (2)。 如果我想编写一个提供模板类和模板函数的C ++库,是不可能将库编译成共享文件(.so,.a),因为它们的实例化不会出现在库的代码中的任何地方,而只会出现在用户的程序? 如果是,是否意味着模板库只是源代码文件而不是预编译文件? 如何实现C ++标准模板库(STL)? 它的源代码是否与用户程序一起预编译或编译? (3)。 在C中, 如何在C ++中编写一个提供类似模板函数的函数的库? 重载是一个好的解决方案吗? 如果我必须为不同类型的参数将一个过程写入不同的函数,那么重用代码是否有好的方法? 这是一个很好的方法来做到这一点http://www.vlfeat.org/api/imop_8c_source.html ? 还有其他方法吗? 感谢致敬!

使用预处理器在C中进行模板化

我想知道为什么我以前从未见过以下方法在C中实现模板。 我的想法是让预处理器成为模板工作。 container.h : #ifndef TEMPLATE_TYPE #error “missing decalaration TEMPLATE_TYPE” #endif #define _CONCAT(a, b) a##b #define _EVALUATOR(a, b) _CONCAT(a, b) #define MAKE_NAME(a, b) _EVALUATOR(a, b) typedef struct { TEMPLATE_TYPE data; } MAKE_NAME(Container_, TEMPLATE_TYPE); main.c : #define TEMPLATE_TYPE int #include “container.h” int main() { Container_int c; c.data = 99923; } 那么,情况如何呢? 这只是被认为是“坏风格” 很明显,没有人会写一篇关于它的文章 有很多文章,只是google man! 如果您不打算用#3回答,我将非常感谢您对此技术的评论。

浮点乘法执行速度较慢,具体取决于C中的操作数

我正在对以前从文件中读取的矩阵执行模板计算。 我使用两种不同的矩阵(NonZero类型和Zero类型)。 两种类型共享边界的值(通常为1000),而其余元素对于零类型为0,对于NonZero类型为1。 该代码将文件的矩阵存储在两个相同大小的分配矩阵中。 然后,它使用自己的值和邻居值(添加x 4和mul x 1)在一个矩阵的每个元素中执行操作,并将结果存储在第二个矩阵中。 一旦计算完成,交换矩阵的指针并且执行相同的操作有限次数。 在这里你有核心代码: #define GET(I,J) rMat[(I)*cols + (J)] #define PUT(I,J) wMat[(I)*cols + (J)] for (cur_time=0; cur_time<timeSteps; cur_time++) { for (i=1; i<rows-1; i++) { for (j=1; j<cols-1; j++) { PUT(i,j) = 0.2f*(GET(i-1,j) + GET(i,j-1) + GET(i,j) + GET(i,j+1) + GET(i+1,j)); } } // Change pointers for next iteration auxP […]

C包装器C ++:如何处理C ++模板?

之前有人要求为c ++类编写ac包装器( C Wrapper for C ++ ),这基本上是清楚的。 还有一个问题:我如何处理c ++模板? 让我们说这是我的class级: template class Temp { T get(); void set(T t); } 是否有一种优雅的方式来编写交流包装?

模板元编程是否比同等的C代码更快?

模板元编程是否比同等的C代码更快? (我说的是运行时性能):)

编译时__FILE__宏操作处理

我在将一些东西从Solaris移植到Linux时遇到的一个问题是Solaris编译器在预处理期间将宏__FILE__扩展为文件名(例如MyFile.cpp),而Linux上的gcc扩展到完整路径(例如/ home) /user/MyFile.cpp)。 使用basename()可以很容易地解决这个问题但是……如果你经常使用它,那么对basename()的所有调用都必须加起来,对吧? 这是问题所在。 有没有办法使用模板和静态元编程,在编译时运行basename()或类似的? 由于__FILE__是常量且在编译时已知,因此可能更容易。 你怎么看? 可以吗?

C ++表达式模板

我目前使用C进行数值计算。 我听说使用C ++ Expression Templates更适合科学计算。 简单来说,什么是C ++表达式模板? 是否有书籍使用C ++表达模板讨论数值方法/计算? 以什么方式,C ++表达模板比使用纯C更好?

如何在C ++中实现no-op宏(或模板)?

如何在C ++中实现no-op宏? #include #ifdef NOOP #define conditional_noop(x) what goes here? #else #define conditional_noop(x) std::cout << (x) #endif int main() { conditional_noop(123); } 我希望在定义NOOP时不执行任何操作,并在未定义NOOP时打印“123”。