関数の引数として固定サイズの配列をインプレースで構築することは可能ですか?

alfC

これは主に、固定サイズの配列に関連するC ++構文のコーナーに関する質問です。

たとえば、型情報を利用する関数があるとします。

template<class T> void fun(T const& t){
    std::cout << typeid(t).name() << std::endl;
}

値または一時オブジェクトを渡すことができます。

int i;
fun(i); // prints "int" ("i" actually)
fun(int{});   // prints "int" ("i" actually)

しかし、私は配列で同じことをすることはできません

double a[10][10];
fun(a); // ok, prints "a[10][10]" ("A10_A10_d" actually)

fun(double[10][10]); // doesn't compile
fun(double{}[10][10]); // doesn't compile
fun(double[10][10]{}); // doesn't compile
fun(double()[10][10]); // doesn't compile
fun(double[10][10]()); // doesn't compile
fun(double(&)[10][10]); // doesn't compile
fun(double(*)[10][10]); // doesn't compile

私は原則として次のことができます。

typedef double a1010[10][10];
fun(a1010{});

しかし、typedefを事前に定義せずに行うことは可能ですか?

関数の引数として固定サイズの配列をインプレースで構築することは可能ですか?

完全なコード:

template<class T> void fun(T const& t){
    std::cout << typeid(t).name() << std::endl;
}

typedef double a1010[10][10];

int main(){
    int i;
    fun(i); // prints "int" ("i" actually)
    double a[10][10];
    fun(a); // prints "a[10][10]" ("A10_A10_d" actually)
    fun(a1010{});

    fun(int{});   // prints "int"
/*  fun(double[10][10]); // doesn't compile
    fun(double{}[10][10]); // doesn't compile
    fun(double[10][10]{}); // doesn't compile
    fun(double()[10][10]); // doesn't compile
    fun(double[10][10]()); // doesn't compile
    fun(double(&)[10][10]); // doesn't compile
    fun(double(*)[10][10]); // doesn't compile
    */
    return 0;
}

ボーナスポイント(おそらく賞金):可変サイズの配列はどうですか?

int N = 10;
f(double[N]);
Michael Veksler

試してみてください:

fun((int[3]){1,2,3});
fun((int[5]){});

「ボーナスポイント」に関して:可変サイズの配列は言語の一部ではありません。この言語の拡張機能は、テンプレート引数では機能しません。

prog.cc:4:6:注:候補テンプレートは無視されます:置換の失敗:可変的に変更されたタイプ 'int [n]'はテンプレート引数として使用できませんfun(const T&t)

編集

クリスが指摘したように、上記のソリューションは、C ++の拡張である複合リテラルを使用することを提案しています単純なヘルパークラスを使用して、C ++へのこの拡張を回避するソリューションがあります。

template <class T, std::size_t N>
struct my_array
{
    T data[N];
};

template <class T, std::size_t N>
void print(const T (&x)[N])
{
     for (auto i: x)
         std::cout << i << '\n';
}

int main()
{
    print(my_array<int,3>{9,10,11}.data);
}

これはうまく機能しますが、テンプレート引数をmy_arrayに追加する必要がありますが、これは推測されません。C ++ 17では、タイプとサイズを自動的に推測することができます。

template <class T, std::size_t N>
struct my_array
{
    constexpr my_array(std::initializer_list<T> x)
    {
       std::size_t i = 0;
       for (auto val : x)
           data[i++] = val;
    }
    T data[N];
};
template <class ...T>
my_array(T...) -> my_array<typename std::common_type<T...>::type, sizeof...(T)>;

int main()
{
    print(my_array{9,10,11}.data);
}

2次元配列の場合、これは少し複雑です。

template <class T, std::size_t N1, std::size_t N2>
struct my_array2d
{
    constexpr my_array2d(std::initializer_list<std::initializer_list<T> > x)
    {
        std::size_t i = 0;
        for (const auto & row : x) {
            int j=0;
            for (const auto & val: row) {
                data[i][j++] = val;
            }
            i++;
        }
    }
    T data[N1][N2];
};
int main()
{
    work(my_array2d<int, 3, 2>{{9,1},{10,2},{11,3}}.data);
}

二次元配列の演繹ガイドをあきらめましたが、それは可能だと思います。

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

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

編集
0

コメントを追加

0

関連記事

分類Dev

引数として任意のサイズの配列を受け入れる関数(Golangでは可能ですか?)

分類Dev

テンプレート引数から配列サイズを抽出することは可能ですか?

分類Dev

フロータイプで、別の関数を引数として取る関数の戻り値を自動推測することは可能ですか?

分類Dev

関数が他の場所で宣言された文字列配列のスライスのサイズを変更することは可能ですか?golang

分類Dev

解凍されたリストの後にタイプ名をテンプレート引数として使用することは可能ですか?

分類Dev

可変個引数テンプレート関数の引数を修正することは可能ですか?

分類Dev

サブタイプのオーバーロードで関数を構成することは可能ですか?

分類Dev

postgresで関数の引数としてWITH句のエイリアスを渡すことは可能ですか?

分類Dev

関数宣言に配列のサイズを含めることのポイントは何ですか?

分類Dev

関数の引数で配列を宣言することは可能ですか?

分類Dev

LLVM IR:関数の引数として渡されたときに、llvm irコードで配列のサイズを取得する方法は?

分類Dev

パラメータとしてポインタを1つだけ使用して、関数内のc配列を実行することは可能ですか?

分類Dev

int配列のカスタムサイズの配列をRealmObjectのフィールドとして保存することは可能ですか?

分類Dev

要素の数なしでJavaで配列を構築することは可能ですか?

分類Dev

Dart2で関数の引数としてオプションのパラメータで関数を指定することは可能ですか?

分類Dev

void配列ポインタ引数を持つ関数はどのようにして配列要素のサイズを知るのですか?

分類Dev

TypeScriptで別の関数の引数の型としてコンストラクター関数を使用することは可能ですか?

分類Dev

C#で固定サイズ以外の配列を作成することは可能ですか?

分類Dev

動的サイズの配列をループして、可変個引数関数の引数としてプロパティを渡す方法は?

分類Dev

関数へのポインターのように、演算子へのポインターを引数として渡すことは可能ですか?

分類Dev

サイズとして変数が与えられた文字配列を持つこのコードがコンパイルされるのはなぜですか?

分類Dev

プレースメントの新しい操作にstd :: nothrow引数を使用することは可能ですか?

分類Dev

C ++テンプレート引数で、タイプとそのタイプの出現回数を指定することは可能ですか?

分類Dev

関数を使用することと、インライン式を使用してスコープ変数を設定することの違いは何ですか

分類Dev

配列のサイズまで任意の量の引数を受け入れることができるカスタム配列クラスのコンストラクターを作成するにはどうすればよいですか?

分類Dev

C ++が派生構造体を使用して親テンプレート構造体をインスタンス化し、親テンプレートが子構造体の関数を呼び出すことができるのはなぜですか?

分類Dev

refを使用して配列マップ関数内のReactコンポーネントにアクセスすることは可能ですか?

分類Dev

コンパイル時に定義された配列のサイズを超える数の要素を配列に含めることは可能ですか?

分類Dev

複数のワードプレスサイトに単一のherokudynoを使用することは可能ですか?

Related 関連記事

  1. 1

    引数として任意のサイズの配列を受け入れる関数(Golangでは可能ですか?)

  2. 2

    テンプレート引数から配列サイズを抽出することは可能ですか?

  3. 3

    フロータイプで、別の関数を引数として取る関数の戻り値を自動推測することは可能ですか?

  4. 4

    関数が他の場所で宣言された文字列配列のスライスのサイズを変更することは可能ですか?golang

  5. 5

    解凍されたリストの後にタイプ名をテンプレート引数として使用することは可能ですか?

  6. 6

    可変個引数テンプレート関数の引数を修正することは可能ですか?

  7. 7

    サブタイプのオーバーロードで関数を構成することは可能ですか?

  8. 8

    postgresで関数の引数としてWITH句のエイリアスを渡すことは可能ですか?

  9. 9

    関数宣言に配列のサイズを含めることのポイントは何ですか?

  10. 10

    関数の引数で配列を宣言することは可能ですか?

  11. 11

    LLVM IR:関数の引数として渡されたときに、llvm irコードで配列のサイズを取得する方法は?

  12. 12

    パラメータとしてポインタを1つだけ使用して、関数内のc配列を実行することは可能ですか?

  13. 13

    int配列のカスタムサイズの配列をRealmObjectのフィールドとして保存することは可能ですか?

  14. 14

    要素の数なしでJavaで配列を構築することは可能ですか?

  15. 15

    Dart2で関数の引数としてオプションのパラメータで関数を指定することは可能ですか?

  16. 16

    void配列ポインタ引数を持つ関数はどのようにして配列要素のサイズを知るのですか?

  17. 17

    TypeScriptで別の関数の引数の型としてコンストラクター関数を使用することは可能ですか?

  18. 18

    C#で固定サイズ以外の配列を作成することは可能ですか?

  19. 19

    動的サイズの配列をループして、可変個引数関数の引数としてプロパティを渡す方法は?

  20. 20

    関数へのポインターのように、演算子へのポインターを引数として渡すことは可能ですか?

  21. 21

    サイズとして変数が与えられた文字配列を持つこのコードがコンパイルされるのはなぜですか?

  22. 22

    プレースメントの新しい操作にstd :: nothrow引数を使用することは可能ですか?

  23. 23

    C ++テンプレート引数で、タイプとそのタイプの出現回数を指定することは可能ですか?

  24. 24

    関数を使用することと、インライン式を使用してスコープ変数を設定することの違いは何ですか

  25. 25

    配列のサイズまで任意の量の引数を受け入れることができるカスタム配列クラスのコンストラクターを作成するにはどうすればよいですか?

  26. 26

    C ++が派生構造体を使用して親テンプレート構造体をインスタンス化し、親テンプレートが子構造体の関数を呼び出すことができるのはなぜですか?

  27. 27

    refを使用して配列マップ関数内のReactコンポーネントにアクセスすることは可能ですか?

  28. 28

    コンパイル時に定義された配列のサイズを超える数の要素を配列に含めることは可能ですか?

  29. 29

    複数のワードプレスサイトに単一のherokudynoを使用することは可能ですか?

ホットタグ

アーカイブ