6

C で記述された SQL ライブラリに C++11 ラッパーを実装しようとしています。C ライブラリには、列インデックスを必要とする SQL ステートメントからさまざまなデータ型を取得するための個別の関数があります。以下に単純なアプローチのプロトタイプを示しますが、重大な欠陥があります。引数の実行順序に依存しているため、安全ではありません (コンパイル エラーが発生する可能性もあり、テストしていません)。

質問:可変個引数テンプレート展開で変数を安全にインクリメントするプラットフォームに依存しない方法は何ですか?

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...
4

2 に答える 2