2015-10-02 10 views
6

std::tupleは高度にテンプレートを搭載した獣です。 n番目のメンバコンパイラにアクセスするには、テンプレートインスタンスを十分に実行する必要がありますが、その単純な性質は、対応する仮想構造体のn番目のデータメンバにアクセスすることです。このような何か(擬似コード)、std::tupleは、コア言語の機能であることを思わ:バリアント集合体はコア言語機能として

template< typename ...types > 
struct/* or class, or even union */ V 
{ 
    types... V; // defines implicitly `operator [/*constant expression*/]` to access by index 
    // if more than one variadic parameter pack provided 
    // (during expanding of parameter pack of template 
    // parameters in specializations) then instead of 
    // `V` there can be specific data-member name (say, `x`), 
    // but still with `x.operator []` implicitly defined 

    // member functions and data members allowed 
}; 

template< typename ...types > 
V< std::decay_t<types>... > make_tuple(types &&... args) 
{ return {std::forward<types>(args)...}; } 
template< typename ...types > 
V< types &&... > forward_as_tuple(types &&... args) 
{ return {std::forward<types>(args)...}; } 
template< typename ...types > 
V< types &... > tie(types &... args) 
{ return {args...}; } 

は、クラスのための可変長のデータ・メンバーの定義構文をサポートしている言語のようなものの任意の提案はありますか?

+1

コア言語機能を使用する利点は何ですか?なぜ 'std :: tuple'だけなのでしょうか?なぜ 'std :: vector'でもないのですか?私の考えは、もし何かがライブラリの機能として行えるのであれば、*それができない(またはあまりにもハッキリしている)場合にのみ、言語機能を追加するのが理にかなっています。 – Nawaz

+0

言語で既に存在する@Nawaz POD配列(単一の型、複数の値)、 'int x [3] = {1、2、3};'。 – Orient

+1

'types ... V;'、 'operator [](size_t)'には関係なく、存在することはできません。 – Barry

答えて

9

関連アイディアについては、N4235 Selecting from Parameter Packsを参照してください。

これはstd::tupleには役立つかもしれませんが、メンバーの選定ではなく、その構成を単純化する機能にもっと興味があります(これは比較的簡単です)。

std::tupleの定義は、すべてのコンストラクタがすべてのメンバーのプロパティを正しくモデル化するように、非常に複雑です(その領域の最新の変更については、N4064を参照してください)。

集約初期化を使用すると、コンパイラは自動的に集約の各メンバーを対応する初期化子から構築できるかどうかをチェックします。それは彼らがexplicitであるかどうかは、適切なコンストラクタをチェックし、関連する左辺値/右辺値カテゴリを受け入れるなど

あなたがstd::tupleのコンストラクタを定義する場合であるexplicitコンストラクタではないことを、唯一の有効な変換が起こることを保証するために非常に複雑である必要があります

私は、集約初期化から無料で得るのと同じセマンティクスをモデル化するのに適したコンストラクタを自動的に生成しやすくする機能が必要です。

+4

クールな提案です! – Barry

+1

そして、私たちはリテラル型バリデーション 'variant ';) –

+0

を実装することさえしませんでした@LucDanton、ええ、私は10 '極でその話題に触れません! :) –

関連する問題