带边界检查的char []安全副本的专用模板

时间:2016-09-09 13:36:55

标签: c++ templates

由于我在项目中使用的是使用C API的库,我必须使用部分char [] [即使我只想使用std::string]。

但是,为了避免在将太长的char *变量复制到修复大小 char []时出现问题,我试图用模板来解决这个问题。

但不幸的是,我坚持专业化。在项目中我们可以假设 目的地变量始终类型char [fixed-value] 并且它不能 char *。因此,这很重要,因为确实没有一种可靠的方法可以确定char *的分配大小。

这就是我迄今为止所做的:

#include <stdio.h>

template <typename T>
void copyWithBoundaryCheck( char destination [], char * source, int maximalSize )
{
    printf( "Correct parameter\n" );
};

template <typename T>
void copyWithBoundaryCheck( T, char * source, int maximalSize )
{
    printf( "Wrong parameter\n" );
};

int main()
{
    char * source = (char *) "Source";
    char * wrongPtr = (char *) malloc( 20 );
    char destination [20];

    copyWithBoundaryCheck( wrongPtr, source, 10 );
    copyWithBoundaryCheck( destination, source, sizeof(destination) );
}

这是输出:

Wrong parameter <-- output for copyWithBoundaryCheck( wrongPtr, source, 10 );
Wrong parameter <-- output for copyWithBoundaryCheck( destination, source, sizeof(destination) );

对于copyWithBoundaryCheck( destination, source, sizeof(destination) );我期待输出Correct parameter,但我始终收到Wrong parameter

我的问题:

如何实现模板函数copyWithBoundaryCheck catch char [numeric-value]的特化?根据我的示例,这意味着copyWithBoundaryCheck( destination, source, sizeof(destination) );会显示Correct parameter

1 个答案:

答案 0 :(得分:4)

你可能正在寻找这样的东西:

<cftransaction>
    <cfquery name="queryInsertA" datasource="source" result="resultA">
        INSERT INTO tableA (columnName) VALUES (value)
    </cfquery>
    <cfquery name="queryInsertB" datasource="source">
        INSERT INTO tableB (fkey_tableA, columnName) VALUES (#resultA.generatedKey#, value)
    </cfquery>
</cftransaction>

Demo