gpt4 book ai didi

c++ - 在可变参数模板扩展中递增 int 的安全方法是什么?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:21:53 25 4
gpt4 key购买 nike

我正在尝试围绕用 C 编写的 SQL 库实现 C++11 包装器。C 库具有单独的函数,用于从需要列索引的 SQL 语句中获取不同的数据类型。下面是一个简单的方法原型(prototype),但有一个严重的缺陷:它依赖于参数执行的顺序,这是不安全的(也可能有编译错误,还没有测试过)。

问题:在可变参数模板扩展中安全递增变量的独立于平台的方法是什么?

template< typename... ColumnTypes >
void SQLStatement::execute( std::function< void( ColumnTypes... ) > rowCallback ){
while( this->nextRow() ){
int column = 0;
rowCallback( this->getColumn< ColumnTypes >( column++ )... );
// unreliable increment ^
}
}

template< typename T >
T SQLStatement::getColumn( const int columnIdx ){}

template<>
inline int SQLStatement::getColumn< int >( const int columnIdx ){
return sql_library_column_int( this->nativeHandle, columnIdx );
}

// Other getColumn specializations here...

最佳答案

这似乎有效。您只需要调整几件事:

#include <functional>
#include <iostream>
#include <cstddef>

void foo(int a, float b, int c) {
std::cout << a << ", " << b << ", " << c << std::endl;
}

template<typename T>
T getColumn(int index) {
return T(index);
}

template<size_t... indexes>
struct index_tuple {};

template<size_t head, size_t... indexes>
struct index_tuple<head, indexes...> {
typedef typename index_tuple<head-1, head-1, indexes...>::type type;
};

template<size_t... indexes>
struct index_tuple<0, indexes...> {
typedef index_tuple<indexes...> type;
};

template<typename... Args>
struct make_index_tuple {
typedef typename index_tuple<sizeof...(Args)>::type type;
};

template<typename... ColumnTypes, size_t... indexes>
void execute(const std::function<void(ColumnTypes...)> &callback, index_tuple<indexes...>) {
// this should be done for every row in your query result
callback(getColumn<ColumnTypes>(indexes)...);
}

template<typename... ColumnTypes>
void execute(const std::function<void(ColumnTypes...)> &callback) {
execute(
callback,
typename make_index_tuple<ColumnTypes...>::type()
);
}

int main() {
std::function<void(int, float, int)> fun(foo);
execute(fun);
}

演示 here .请注意,函数foo 仅用于显示索引正确递增,就像getColumn 中的return T(index); 一样。

关于c++ - 在可变参数模板扩展中递增 int 的安全方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15755632/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com