2

いくつかの数値バイト値を経由して渡したい初期化子リスト可変個引数テンプレートを配列に変換します。それは可能ですか?

template < int N > struct a {
  char s[N];
  template < typename ... A >
  a (A ... _a) : s {_a...} {}
};

int main () {
  // g++-4.5: error: narrowing conversion of »_a#0« from »int« to »char« inside { }
  a < 3 > x { 1, 2, 3 };
}

私が考えることができるのは

  • 8進表現、「\ 001」などを使用するには、または
  • すべての値をキャストします。

しかし、どちらも満足のいくものではありません。

4

3 に答える 3

2

複雑なコードは必要ありません

template < int N > struct a {
  char s[N];
  template < typename ... A >
  a (A ... _a) : s {static_cast<char>(_a)...} {}
};
于 2011-01-14T12:31:00.143 に答える
0

実際には初期化子リストを使用していません。コンストラクターは可変個引数テンプレートを受け取り、均一初期化で初期化xします。

唯一の問題は、配列をで初期化する洗練された方法がわからないことですinitializer_list。AFAIKstd::arrayには、受け入れるコンストラクターが必要initializer_listですが、g++ではまだサポートされていないようです。

#include <utility>
template < int N > struct a {
    char s[N];

    a (std::initializer_list<char> list) {
        if (N != list.size()) 
            throw "list wrong size";

        int i = 0;
        const char* p = list.begin();
        while(p != list.end())
            s[i++] = *p++;
    }
};
于 2010-09-15T19:00:40.113 に答える
0

注:クラスに機能を追加して集約されていない場合を除いて、これはすべて不要です。(たとえば、他のコンストラクター、プライベートメンバー、基本クラスなど)問題のコードを修正する直接の方法は、コンストラクターを削除することです。それで、それにもっと何かがあると仮定しましょう。

私は何人かの人々がこのようなことをしようとしているのを見ました。変換セマンティクスを処理し、通常の関数呼び出しの機能を人為的に再作成しようとすると、醜いように見えます。

これは、そもそも適切なコンストラクターを持つ配列クラスを作成するための戦略です。

テンプレートエイリアシングは醜さを隠すことでケーキにアイシングをかけます::typeが、それはまだGCCにはありません。

template< typename ... NT >
struct var_ctor_array {
    enum { size_e = 0 }; // only used for zero size case
};

template< typename T, typename ... NT >
struct var_ctor_array< T, NT ... > {
    enum { size_e = 1 + sizeof...( NT ) };

    T st[ size_e ];

    var_ctor_array( T elem0, NT ... elemN )
        : st { elem0, elemN ... } {}
};

template< typename T, size_t N, typename ... NT >
struct gen_var_ctor_array {
    typedef typename gen_var_ctor_array< T, N-1, T, NT ... >::type type;
};

template< typename T, typename ... NT >
struct gen_var_ctor_array< T, 0, NT ... > {
    typedef var_ctor_array< NT ... > type;
};

int main() { // usage
    gen_var_ctor_array< char, 5 >::type five( 1, 2, 3, 4, 5 );
}
于 2010-09-16T04:59:17.877 に答える