std::array<T,N>とinitializer_list<T>

zxc
記事: 79
登録日時: 13年前
住所: 日本の背骨(?)あたり

std::array<T,N>とinitializer_list<T>

投稿記事 by zxc » 10年前

 std::arrayにはinitializer_listを引数にとるコンストラクタは無いらしい。 cpulsplusのarray
(でも {} で初期化してたと思うからあれはたぶん配列の初期化と一緒でこれとは違う?)

 例えばstd::arrayを内部にもつクラスの、std::arrayの初期化を伴うコンストラクタを考えてみる。
 
  1. initializer_listで受け取るようにする
  2. 可変長テンプレートで受け取るようにする
1の雰囲気(足りない場合と多い場合の処理は不適切かもしれないしそもそもコンパイルで死ぬかもしれない)

CODE:

////std::array class::data;
ctor(std::initializer_list list) {
	if (list.size() > this->data.size()){
		std::copy(list.begin(), list.begin() + this->data.size(), this->data.begin());
	}
	else{
		std::copy(list.begin(), list.end(), this->data.begin());
	}
 ただし、クラスの内部ではなくそのまま扱い、型が同じだけど幾つか集まっているような(std::tupleみたいな)ものを考えるのならば、2.の可変長テンプレートやmake_tuple様のヘルパ関数なんかに任せるほうが適切なのかもしれない。make_arrayの例

 要素数が確定してしまっていてそれらをどう初期化するのかが問題ならばinitializer_listでも良い、くらい限定的なんだろうかな・・・

アバター
tk-xleader
記事: 158
登録日時: 14年前

RE: std::array<T,N>とinitializer_list<T>

投稿記事 by tk-xleader » 10年前

コンストラクタで直接std::arrayを受け取ってしまうというのはどうでしょうか?

CODE:

#include 
#include 
#include 

void func(std::arrayar){
    for(int val:ar){
        std::cout<<val<<std::endl;
    }
}

int main()
{
    func({0,1,2});
    return 0;
}
https://ideone.com/gu97jU

上記の例はコンストラクタではないですが、コンストラクタでも応用できるはずです。
ただ、initializer_listと違って、要素数を超える場合はコンパイルエラーになりますが…

zxc
記事: 79
登録日時: 13年前
住所: 日本の背骨(?)あたり

Re: std::array<T,N>とinitializer_list<T>

投稿記事 by zxc » 10年前

 あーなるほど・・・ 確かにスマートで便利かもしれません。 ただ、より少ない要素数での初期化も許すような実装はちょっと面倒になりそうな。

アバター
tk-xleader
記事: 158
登録日時: 14年前

RE: std::array<T,N>とinitializer_list<T>

投稿記事 by tk-xleader » 10年前

zxc さんが書きました:より少ない要素数での初期化も許すような実装はちょっと面倒になりそうな。

CODE:

#include 
#include 
#include 
 
void func(std::arrayar){
    for(int val:ar){
        std::cout<<val<<std::endl;
    }
}
 
int main()
{
    func({0,1,2});
    return 0;
}
https://ideone.com/14MoIM

確かに、より少ない要素数での初期化は防げないです。それがまずければまた別の手を考えることになります。

zxc
記事: 79
登録日時: 13年前
住所: 日本の背骨(?)あたり

Re: std::array<T,N>とinitializer_list<T>

投稿記事 by zxc » 10年前

 いや、「防ぐ」ではなく「許す」のが面倒になるかと思っていましたが、実際にはその反対で少ない要素での初期化は「許す」が「防ぐのが難しい」のですね。勉強になります。