C ++のテンプレート/リファレンス

iNukeLaPeste

午前3時30分で、C ++のテンプレートに関する演習に取り組んでいます。この場合、私が間違っていることがわかりません。理解するのを手伝っていただけませんか。(私は2週間前に始めたC ++があまり得意ではありません)。

件名は次のとおりです。

[...]、関数テンプレートforeachをコーディングする必要があります。この関数を使用すると、この配列の各要素に対して関数を呼び出すことにより、配列をざっと見ることができます。関数は、配列の先頭のアドレス、関数の参照、および配列のサイズを引数として受け入れます。関数の参照は、次のプロトタイプに対応しています。voidfunc(const type&elem); さらに、関数foreachに渡され、タイプに関係なく、各要素を1行に1つずつ表示する関数printを提供する必要があります。

そしてここに私のコードがあります:

ex03.hpp

#ifndef __EX03_H_INCLUDED__
# define __EX03_H_INCLUDED__

#include <iostream>
#include <iomanip>

template<typename type>
void foreach(type tab[0], (*)(print(const type& elem)), type size)
{
  int                   i;

  for (i = 0; i != size; i++)
    print(tab[i]);
}

template<typename type>
void print(const type& elem)
{
  std::cout << elem << std::endl;
}

#endif /* !__EX03_H__ */

そして:

main.cpp

#include "ex03.hpp"

int main(void)  
{
  int tab[] = { 11, 3, 89, 42 };
  foreach(tab, print<int>, 4);
  std::string tab2[] = { "j’", "aime", "les", "templates", "!" };
  foreach(tab2, print, 5);
  return 0;
}

ex03.hppの提出のみが許可されており、これはテストメインにすぎません。私が間違っていることを理解したいと思います。ありがとう!

user7435094

問題は、foreachテンプレート関数にあります。

  • 最初のパラメーターは、配列へのポインターにすることも、サイズが定義されていない静的配列配列にすることもできます。
  • 2番目のパラメーターは、関数ポインターまたは関数への参照にすることができます(変更されないため、参照によって配列要素と同じタイプの定数要素を受け入れる必要があります)
  • 配列サイズは必ずしも配列要素タイプと同じタイプではないため、3番目のパラメーターは異なるタイプにする必要があります

修正されたex03.hppは次のようになります。

#ifndef __EX03_H_INCLUDED__
#define __EX03_H_INCLUDED__

#include <iostream>

// option 1
template<typename T1, typename T2>
void foreach(T1* arr, void (*fnc)(const T1&), T2 size) {
    for (T2 i = 0; i < size; i++) {
        (*fnc)(arr[i]);
    }
}

// option 2
template<typename T1, typename T2>
void foreach(T1 arr[], void (&fnc)(const T1&), T2 size) {
    for (T2 i = 0; i < size; i++) {
        (*fnc)(arr[i]);
    }
}

template<typename T1>
void print(const T1& element) {
    std::cout << element << std::endl;
}

#endif /* !__EX03_H__ */

そしてmain.cpp:

#include "ex03.hpp"

#include <string>

int main() {
    const size_t tab1Size = 4;
    int tab1[tab1Size] = { 11, 3, 89, 42 };

    foreach(tab1, print, tab1Size);

    const size_t tab2Size = 5;
    std::string tab2[tab2Size] = { "j’", "aime", "les", "templates", "!" };
    foreach(tab2, print, tab2Size);

    return 0;
}

しかし、他の人が前に言ったように、私は最初にc ++の基本を学ぶべきであることに同意します。そうすれば、より複雑なものをより理解しやすくなります。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

CLionの新しいC ++クラスファイルテンプレート

分類Dev

C、Linuxのディレクトリとファイルの再帰的リストでのセグメンテーション違反(コアダンプ)

分類Dev

Objective-cを使用してプレーンテキストのリモートファイルからコンテンツを読み取る方法

分類Dev

C ++イテレータリファレンスを返す

分類Dev

C ++アプリケーションのエンドツーエンドテストフレームワーク

分類Dev

C ++ 11テンプレートとエイリアスの宣言

分類Dev

C ++-内部テンプレートクラスのテンプレートメソッドを別のファイルに実装する

分類Dev

テンプレートクラスのデフォルト引数を持つC ++ 17エイリアステンプレート

分類Dev

C#-SQL Serverストアドプロシージャ-リファレンス?

分類Dev

可変個引数テンプレートの問題を使用するC ++ファクトリ

分類Dev

C ++テキストフィルタリングテンプレートライブラリ/エンジン

分類Dev

C ++ 11のデフォルトのテンプレート引数 'using'タイプエイリアス

分類Dev

C ++リファレンスの初期化

分類Dev

C ++テンプレート実装ファイル拡張子の規則?

分類Dev

特定の型リスト用のC ++専用テンプレートクラス

分類Dev

c ++ 11テンプレートファクトリパターンとパラメータ付きコンストラクタ

分類Dev

c ++ 11テンプレートファクトリパターンとパラメータ付きコンストラクタ

分類Dev

C ++ 11 g ++ストレンジネス(デフォルトのテンプレート、lambda&remove_ifを使用)

分類Dev

テンプレートでのC ++のメモリリーク

分類Dev

C ++テンプレートフレンド演算子と追加のテンプレート引数

分類Dev

クラステンプレートをC ++のクラステンプレートのフレンドとして宣言する

分類Dev

C ++テンプレート内部クラスフレンド演算子のオーバーロード

分類Dev

(最小化できますか)C ++コードのテンプレートのフットプリント?

分類Dev

C ++テンプレートタイプの循環性とテンプレートインスタンスへの非テンプレートポインタ

分類Dev

テンプレートクラスのデフォルト値、C ++

分類Dev

C ++関数テンプレートのフォーマット

分類Dev

C ++ 11のフレンドテンプレートクラスでのVisualC ++エラー

分類Dev

C ++用語リファレンスおよびイテレータ

分類Dev

テンプレートクラスのC ++テンプレートコピーコンストラクタ

Related 関連記事

  1. 1

    CLionの新しいC ++クラスファイルテンプレート

  2. 2

    C、Linuxのディレクトリとファイルの再帰的リストでのセグメンテーション違反(コアダンプ)

  3. 3

    Objective-cを使用してプレーンテキストのリモートファイルからコンテンツを読み取る方法

  4. 4

    C ++イテレータリファレンスを返す

  5. 5

    C ++アプリケーションのエンドツーエンドテストフレームワーク

  6. 6

    C ++ 11テンプレートとエイリアスの宣言

  7. 7

    C ++-内部テンプレートクラスのテンプレートメソッドを別のファイルに実装する

  8. 8

    テンプレートクラスのデフォルト引数を持つC ++ 17エイリアステンプレート

  9. 9

    C#-SQL Serverストアドプロシージャ-リファレンス?

  10. 10

    可変個引数テンプレートの問題を使用するC ++ファクトリ

  11. 11

    C ++テキストフィルタリングテンプレートライブラリ/エンジン

  12. 12

    C ++ 11のデフォルトのテンプレート引数 'using'タイプエイリアス

  13. 13

    C ++リファレンスの初期化

  14. 14

    C ++テンプレート実装ファイル拡張子の規則?

  15. 15

    特定の型リスト用のC ++専用テンプレートクラス

  16. 16

    c ++ 11テンプレートファクトリパターンとパラメータ付きコンストラクタ

  17. 17

    c ++ 11テンプレートファクトリパターンとパラメータ付きコンストラクタ

  18. 18

    C ++ 11 g ++ストレンジネス(デフォルトのテンプレート、lambda&remove_ifを使用)

  19. 19

    テンプレートでのC ++のメモリリーク

  20. 20

    C ++テンプレートフレンド演算子と追加のテンプレート引数

  21. 21

    クラステンプレートをC ++のクラステンプレートのフレンドとして宣言する

  22. 22

    C ++テンプレート内部クラスフレンド演算子のオーバーロード

  23. 23

    (最小化できますか)C ++コードのテンプレートのフットプリント?

  24. 24

    C ++テンプレートタイプの循環性とテンプレートインスタンスへの非テンプレートポインタ

  25. 25

    テンプレートクラスのデフォルト値、C ++

  26. 26

    C ++関数テンプレートのフォーマット

  27. 27

    C ++ 11のフレンドテンプレートクラスでのVisualC ++エラー

  28. 28

    C ++用語リファレンスおよびイテレータ

  29. 29

    テンプレートクラスのC ++テンプレートコピーコンストラクタ

ホットタグ

アーカイブ